如果行不是重复的,或者行的 ID 不是 SQL SSMS 中的某个数字,则更新列
Posted
技术标签:
【中文标题】如果行不是重复的,或者行的 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 【发布时间】:2022-01-24 00:14:21 【问题描述】:我有一张表,我希望使用以下更新命令将isExcluded = 1
设置为PhoneID
和PhoneName
不重复的所有行以及ID
没有最小的所有行如果这些行没有重复的PhoneID
和PhoneName
,则来自选定PhoneID
的编号(即:由于所有带有PhoneID = 2
的行都不重复,因此包含PhoneName = b
的行具有最小的ID,因为它是@ 987654332@。因此,所有带有PhoneID = 2
和ID > 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 |
【问题讨论】:
【参考方案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 IsEx
和 where IsEx is not null
并更新您喜欢的任何列。
我知道这不是我问的,我只是想知道这是否可能。非常感谢!
一切皆有可能,除非不是:)以上是关于如果行不是重复的,或者行的 ID 不是 SQL SSMS 中的某个数字,则更新列的主要内容,如果未能解决你的问题,请参考以下文章