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字段上排序的吗?是的,这对我来说是正确的,没有太多问题。谢谢很高兴帮助:-最快的回复,对我来说没有太多问题。谢谢很高兴能帮忙:-