如果行不重复,或者行的 ID 不是 SQL SSMS 中的特定数字,则更新列

Update a column if a row is not a duplicate, or a row's ID isn't a certain number in SQL SSMS

我有一个 table,我希望以下更新命令将 isExcluded = 1 设置为 PhoneIDPhoneName 不重复的所有行和所有行如果这些行没有重复的 PhoneIDPhoneName,则 ID 不具有所选 PhoneID 中的最小数字(即:因为所有行都带有 PhoneID = 2 不是重复项,包含 PhoneName = b 的行具有最小的 ID,因为它是 ID = 3。因此,所有包含 PhoneID = 2ID > 3 的行将具有它们的 IsExcluded 设置为 1).

ID PhoneID PhoneName isExcluded
1 1 a 0
2 1 a 0
3 2 b 0
4 2 c 0
5 2 d 0
6 2 e 0
7 3 c 0
8 3 c 0
9 3 d 0
10 3 d 0

这是我编写的 SQL 脚本。它似乎只得到非重复项。

WITH Duplicates AS
(
    SELECT
        ID, PhoneID, PhoneName, isExcluded,
        (ROW_NUMBER() OVER (PARTITION BY PhoneName, PhoneID ORDER BY ID)) AS RowNum
    FROM
        Phones
)
UPDATE Phones
SET isExcluded = 1
FROM Duplicates d
WHERE (
d.PhoneID = Phones.PhoneID     
AND d.PhoneName = Phones.PhoneName 
AND d.RowNum =< 1);

SELECT * FROM Phones;

这个table应该是我命令的结果

ID PhoneID PhoneName isExcluded
1 1 a 0
2 1 a 0
3 2 b 0
4 2 c 1
5 2 d 1
6 2 e 1
7 3 c 0
8 3 c 0
9 3 d 1
10 3 d 1

这看起来是 缺口和孤岛 问题的变体,您可以通过首先对分区进行分组然后使用可更新的 CTE 分配 isExcluded价值

with gp as (
    select *, 
      Row_Number() over(order by id) 
      - Row_Number() over(partition by phoneid, phonename order by id) gp
    from t
), p as (
    select *, 
      case when Min(gp) over(partition by phoneid) <gp then 1 end IsEx
    from gp
)
update p set isExcluded = isEx
where IsEx = 1

working DB<>Fiddle