我有一個表,我想下面的update命令集isExcluded = 1來的所有行PhoneID和PhoneName不重復且所有行ID沒有沒有從選擇最小的數字PhoneID,如果這些行沒有重復的PhoneID和PhoneName(即: 由于所有行都PhoneID = 2不是重復的,所以包含的行PhoneName = b具有最小的 ID,因為它是ID = 3。因此,所有帶有PhoneID = 2和 的行都ID > 3將IsExcluded設定為1)。
| ID | 電話號碼 | 電話名稱 | 被排除在外 |
|---|---|---|---|
| 1 | 1 | 一個 | 0 |
| 2 | 1 | 一個 | 0 |
| 3 | 2 | 乙 | 0 |
| 4 | 2 | C | 0 |
| 5 | 2 | d | 0 |
| 6 | 2 | 電子 | 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 | 電話號碼 | 電話名稱 | 被排除在外 |
|---|---|---|---|
| 1 | 1 | 一個 | 0 |
| 2 | 1 | 一個 | 0 |
| 3 | 2 | 乙 | 0 |
| 4 | 2 | C | 1 |
| 5 | 2 | d | 1 |
| 6 | 2 | 電子 | 1 |
| 7 | 3 | C | 0 |
| 8 | 3 | C | 0 |
| 9 | 3 | d | 1 |
| 10 | 3 | d | 1 |
uj5u.com熱心網友回復:
這看起來是間隙和孤島問題的變體,您可以通過首先對磁區進行分組然后使用可更新的 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
見作業資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/390528.html
標籤:sql sql-server 查询语句
