【问题标题】:Select or update only one duplicate from multiple rows [duplicate]从多行中仅选择或更新一个副本[重复]
【发布时间】:2021-12-02 17:26:47
【问题描述】:

我想要做的是为表Customers 中的所有重复项设置列Deleted = 1,除了一个。所以只剩下一个条目。

表:

| 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 |

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

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

【问题讨论】:

    标签: sql-server count duplicates common-table-expression


    【解决方案1】:

    您已经完成了一半,您需要在窗口上使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-25
      • 2016-02-15
      • 2019-12-06
      • 2015-05-15
      • 2021-04-16
      • 2015-09-19
      • 2021-10-30
      • 1970-01-01
      相关资源
      最近更新 更多