如何更新给定 ID 不是最新的记录?

问题描述 投票:0回答:2

这里有一个示例数据集来说明我的问题。

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>)
sql sql-update subquery ssms
2个回答
1
投票

我们可以尝试借助现有逻辑进行更新:

UPDATE Addresses a1
SET IsCurrentAddress = 'N'
WHERE EXISTS (
    SELECT 1
    FROM Addresses a2
    WHERE a2.PersonID = a1.PersonID AND
          a2.CreatedDateTime > a1.CreatedDateTime
);

上述逻辑将当前地址标志设置为没有任何记录,其中存在同一个人的另一条记录具有更近的创建时间。


0
投票

如果我在两行之间正确阅读,您想要

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;
© www.soinside.com 2019 - 2024. All rights reserved.