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。
尝试了 DISTINCT
和 GROUP 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
我想要做的是为 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。
尝试了 DISTINCT
和 GROUP 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