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