如何更新指定PersonID下非最新地址记录的IsCurrentAddress字段
批量更新非最新地址的IsCurrentAddress字段
示例数据集
| ID | PersonID | PersonName | Address | IsCurrentAddress | CreatedDateTime |
|---|---|---|---|---|---|
| 1 | 20 | James | 123 Peach St | Y | 3/1/2023 |
| 2 | 20 | James | 2844 Hollander Rd | Y | 10/14/2023 |
| 3 | 5 | Alexa | 846 Anytown Way | Y | 5/23/2022 |
| 4 | 5 | Alexa | 374 Wayward Blvd | Y | 1/6/2023 |
| 5 | 5 | Alexa | 927 Beachnut St | Y | 9/4/2023 |
需求说明
Alexa和James搬家后新增了地址记录,现在需要把每位用户非最新地址的IsCurrentAddress字段设为'N',也就是要更新ID为1、3、4的记录。之前找到的方案大多是查询逻辑,没有合适的更新操作方案,这里提供两种可行的SQL更新方案:
方案一:用ROW_NUMBER()筛选最新地址ID
UPDATE Addresses SET IsCurrentAddress = 'N' WHERE ID NOT IN ( SELECT ID FROM ( SELECT ID, PersonID, CreatedDateTime, -- 按用户分组,地址创建时间倒序排序,最新地址标记为1 ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY CreatedDateTime DESC) AS rn FROM Addresses ) AS ranked_addresses WHERE rn = 1 )
逻辑:先给每个用户的地址按创建时间倒序排名,取出排名为1的最新地址ID,再更新不在这个ID列表里的所有记录,将它们的IsCurrentAddress设为'N'。
方案二:用EXISTS判断是否存在更新地址
UPDATE Addresses a SET IsCurrentAddress = 'N' WHERE EXISTS ( -- 检查同一个用户是否有比当前记录创建时间更晚的地址 SELECT 1 FROM Addresses b WHERE b.PersonID = a.PersonID AND b.CreatedDateTime > a.CreatedDateTime )
逻辑:直接判断当前地址是否不是用户的最新地址——如果同一个用户存在创建时间更晚的地址,就把当前地址的IsCurrentAddress设为'N',写法更简洁。
内容的提问来源于stack exchange,提问作者Etienne Pierre-Jerome
相关产品推荐
相关产品推荐

