Select 或仅更新多行中的一个重复项

Select or update only one duplicate from multiple rows

我想要做的是为 table Customers 中的所有重复项设置列 Deleted = 1 除了一个。这样就剩下一个条目了。

Table:

| Deleted | ID   | Number | Name  |
-----------------------------------
| 0       | 2A3E | 100004 | Andy  | 
| 0       | 9P3W | 102506 | Judy  |
| 0       | 3R4Z | 120097 | Freddy| 
| 0       | 1G5Y | 103905 | Nikky |
| 0       | 2A3E | 103905 | Nikky | 
| 0       | 9P3W | 147001 | Johnny|
| 0       | 5K7V | 120097 | Teddy | 
| 0       | 6D8S | 120097 | Teddy |

查询:

WITH DataSource AS
(
    SELECT *, 
    COUNT(*) OVER (PARTITION BY Number) count_calc
    FROM Customers
)
SELECT *
FROM DataSource
WHERE count_calc > 1

结果:

| Deleted | ID   | Number | Name  |
-----------------------------------
| 0       | 1G5Y | 103905 | Nikky |
| 0       | 2A3E | 103905 | Nikky | 
| 0       | 5K7V | 120097 | Teddy | 
| 0       | 6D8S | 120097 | Teddy |

现在我想设置 Deleted = 1 只为一只 Nikky 和一只 Teddy。

尝试了 DISTINCTGROUP BY 但没有成功。我如何修改查询,使其 returns 只有 Nikky 和 ​​Teddy 的重复项之一,而不是两者?但同时 returns 所有列,以便我可以将 Deleted 的一设置为 1?

你在途中,你需要在 window 上使用 row_number,然后你可以使用可更新的 CTE:

with d as (
    select * , Row_Number() over(partition by number order by id) rn
    from customers
)
update d set deleted=1 where rn>1