【问题标题】:Update a column if a row is not a duplicate, or a row's ID isn't a certain number in SQL SSMS如果行不是重复的,或者行的 ID 不是 SQL SSMS 中的某个数字,则更新列
【发布时间】:2022-01-24 00:14:21
【问题描述】:

我有一张表,我希望使用以下更新命令将isExcluded = 1 设置为PhoneIDPhoneName 不重复的所有行以及ID 没有最小的所有行如果这些行没有重复的PhoneIDPhoneName,则来自选定PhoneID 的编号(即:由于所有带有PhoneID = 2 的行都不重复,因此包含PhoneName = b 的行具有最小的ID,因为它是@ 987654332@。因此,所有带有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;

这个表应该是我的命令的结果。

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案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

    【讨论】:

    • 工作正常!如果将列的 isExcluded 设置为 1,而将 PhoneID 设置为等于行的 ID,会怎样?
    • 这不是您要求的,但您可以轻松地将其修改为 then id end IsExwhere IsEx is not null 并更新您喜欢的任何列。
    • 我知道这不是我问的,我只是想知道这是否可能。非常感谢!
    • 一切皆有可能,除非不是:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多