这里有一个示例数据集来说明我的问题。
ID | 人号 | 人名 | 地址 | 是当前地址 | 创建日期时间 |
---|---|---|---|---|---|
1 | 20 | 詹姆斯 | 123 桃街 | Y | 3/1/2023 |
2 | 20 | 詹姆斯 | 2844 霍兰德路 | Y | 10/14/2023 |
3 | 5 | 亚历克莎 | 846 Anytown Way | Y | 5/23/2022 |
4 | 5 | 亚历克莎 | 374 任性大道 | Y | 1/6/2023 |
5 | 5 | 亚历克莎 | 927 Beachnut 街 | Y | 9/4/2023 |
Alexa 和 james 感动了,所以创造了新的记录来反映这一点。我想更新每个人的旧记录以反映它不再是他们当前的地址。本质上是检测 ID 1、3 和 4 不是每个人的最新地址,并将他们的 IsCurrentAddress 设置为 'N'
在其他地方查找这个问题,我找不到任何 updating,我认为这需要与仅选择不同的逻辑。 我在想一些事情:
UPDATE Addresses SET IsCurrentAddress = 'N'
WHERE ID IS NOT IN (<List of ID's that have the most recent CreatedDateTime for thier PersonID>)
我们可以尝试借助现有逻辑进行更新:
UPDATE Addresses a1
SET IsCurrentAddress = 'N'
WHERE EXISTS (
SELECT 1
FROM Addresses a2
WHERE a2.PersonID = a1.PersonID AND
a2.CreatedDateTime > a1.CreatedDateTime
);
上述逻辑将当前地址标志设置为没有任何记录,其中存在同一个人的另一条记录具有更近的创建时间。
如果我在两行之间正确阅读,您想要
UPDATE
除“每组前1行”之外的任何内容,其中IsCurrentAddress
的值为'Y'
并将其设置为'N'
。如果是这样,一个解决方案是 UPDATE
able CTE:
WITH CTE AS(
SELECT IsCurrentAddress,
ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY CreatedDateTime DESC) AS RN
FROM dbo.YourTable)
UPDATE CTE
SET IsCurrentAddress = 'N'
WHERE IsCurrentAddress = 'Y'
AND RN > 1;