Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL使用值更新除最后一条记录之外的所有记录_Sql_Sql Server - Fatal编程技术网

SQL使用值更新除最后一条记录之外的所有记录

SQL使用值更新除最后一条记录之外的所有记录,sql,sql-server,Sql,Sql Server,我需要做一个查询,其中只有拥有汽车的每个用户的最后一行才能获得车牌号 ID UserId LicensePlate HasCar 1 1 ABC123 1 2 1 ABC123 1 3 2 NULL 0 4 3 UVW789 1 5 3 UVW789 1 应成为:

我需要做一个查询,其中只有拥有汽车的每个用户的最后一行才能获得车牌号

ID    UserId    LicensePlate    HasCar
1     1         ABC123          1
2     1         ABC123          1
3     2         NULL            0
4     3         UVW789          1
5     3         UVW789          1
应成为:

ID    UserId    LicensePlate    HasCar
1     1         NULL            1
2     1         ABC123          1
3     2         NULL            0
4     3         NULL            1
5     3         UVW789          1

因此,我基本上需要找到拥有许可证的所有用户,并更改除最后一个以外的所有用户,并使许可证为空

假设ID列是一个标识列,因此它可以提供排序,类似这样的操作应该可以做到:

;WITH CTE AS
(
    SELECT Id, 
           UserId, 
           LicensePlate, 
           ROW_NUMBER() OVER(PARTITION BY UserId ORDER BY Id DESC) rn
    FROM Table
    WHERE HasCar = 1
)

UPDATE CTE
SET LicensePlate = NULL
WHERE rn > 1

假设ID列是一个标识列,因此它可以提供排序,类似这样的操作应该可以实现:

;WITH CTE AS
(
    SELECT Id, 
           UserId, 
           LicensePlate, 
           ROW_NUMBER() OVER(PARTITION BY UserId ORDER BY Id DESC) rn
    FROM Table
    WHERE HasCar = 1
)

UPDATE CTE
SET LicensePlate = NULL
WHERE rn > 1
你可以试试这个

UPDATE l
SET l.LicensePlate = null
FROM Car l
INNER JOIN (SELECT UserId, Max(Id) AS max_id
            FROM Car 
            GROUP BY UserId) m ON m.UserId = l.UserId
                                  AND m.max_id <> l.id 
你可以试试这个

UPDATE l
SET l.LicensePlate = null
FROM Car l
INNER JOIN (SELECT UserId, Max(Id) AS max_id
            FROM Car 
            GROUP BY UserId) m ON m.UserId = l.UserId
                                  AND m.max_id <> l.id 

您可以使用表本身上的联接来执行此操作,如下所示:

UPDATE car c
INNER JOIN car c2 ON c.userId = c2.userId AND c.id < c2.id AND c.HasCar = 1 AND c2.HasCar = 1
SET c.LicensePlate = NULL

条件c.id,您可以通过表本身上的连接来完成,如下所示:

UPDATE car c
INNER JOIN car c2 ON c.userId = c2.userId AND c.id < c2.id AND c.HasCar = 1 AND c2.HasCar = 1
SET c.LicensePlate = NULL

条件c.id
  ;WITH License(ID,UserId,LicensePlate,HasCar)
as
(
SELECT 1,1,'ABC123',1 UNION ALL
SELECT 2,1,'ABC123',1 UNION ALL
SELECT 3,2,NULL   ,0  UNION ALL
SELECT 4,3,'UVW789',1 UNION ALL
SELECT 5,3,'UVW789',1
)

SELECT ID,UserId,LAG(LicensePlate,1,NULL) OVER(PARTITION BY UserId ORDER BY LicensePlate),HasCar FROM License

通过使用滞后函数,您也可以实现它

  ;WITH License(ID,UserId,LicensePlate,HasCar)
as
(
SELECT 1,1,'ABC123',1 UNION ALL
SELECT 2,1,'ABC123',1 UNION ALL
SELECT 3,2,NULL   ,0  UNION ALL
SELECT 4,3,'UVW789',1 UNION ALL
SELECT 5,3,'UVW789',1
)

SELECT ID,UserId,LAG(LicensePlate,1,NULL) OVER(PARTITION BY UserId ORDER BY LicensePlate),HasCar FROM License

这些是在ID字段上排序的吗?是的,这是正确的。这些是在ID字段上排序的吗?是的,这对我来说是正确的,没有太多问题。谢谢很高兴帮助:-最快的回复,对我来说没有太多问题。谢谢很高兴能帮忙:-