【问题标题】:Delete duplicates, keeping one of them, grouping by [duplicate]删除重复项,保留其中一个,按 [重复] 分组
【发布时间】:2019-06-02 08:30:53
【问题描述】:

我需要删除每个表 ID 的所有重复项,但只有一个。像下面这样。我需要删除 01,02,03 的 valueid 上的所有重复项...

原文:

id      | valueid   |   data
____________________________
01      | 1001      |   datadata1       
01      | 1002      |   datadata2
01      | 1001      |   datadata1
02      | 1323      |   datamoredata123
02      | 1323      |   datamoredata123
03      | 22123     |   evenmoredata
03      | 24444     |   andalsomore

应该像这样结束:

id      | valueid   |   data
____________________________
01      | 1001      |   datadata1       
01      | 1002      |   datadata2
02      | 1323      |   datamoredata123
03      | 22123     |   evenmoredata
03      | 24444     |   andalsomore

试图用这样的东西来做,但我不明白如何在 id 上对删除进行分组

WITH CTE AS(
   SELECT valueid,
       RN = ROW_NUMBER()OVER(PARTITION BY valueid ORDER BY valueid)
   FROM tblvalues
)
DELETE FROM CTE WHERE RN > 1

有什么建议吗?

提前致谢

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    一个非常简单的方法是在列 (valueid) 中添加唯一索引。编写 ALTER 语句时,请指定 IGNORE 关键字。

    ALTER IGNORE TABLE tblvalues
    ADD UNIQUE INDEX idx_name (valueid);
    

    这将删除所有重复的行。作为一个额外的优势,未来重复的 INSERT 将是错误的。与往常一样,您可以在运行此类操作之前进行备份。

    【讨论】:

    • 发布代码答案时,对 OP 解释您提供的答案很有帮助。在这种情况下,这个答案如何帮助 OP DELETE 重复的行?
    • 感谢您的更新,但是,如果您运行该更新,您将收到错误 Unknown object type 'IGNORE' used in a CREATE, DROP, or ALTER statement. db<>fiddle
    • @Larnu 更新答案,抱歉
    • 问题是,这是一个已经关闭的数据库设计。现在真的不能改。不过,感谢您的时间和回答。
    【解决方案2】:

    你很接近。您需要更改partition by 子句。您希望每对 id/valueid 有一行,因此它们都应该在分区子句中:

    WITH todelete AS (
       SELECT valueid,
           RN = ROW_NUMBER() OVER (PARTITION BY id, valueid ORDER BY data)
       FROM tblvalues
    )
    DELETE FROM todelete WHERE RN > 1;
    

    【讨论】:

    • 另外,我将按顺序包含数据列(在 valueid 之后)...
    【解决方案3】:

    您需要在PARTITION 中添加id 列:

    WITH CTE AS(
       SELECT valueid,
           RN = ROW_NUMBER()OVER( PARTITION BY id, valueid ORDER BY data)
       FROM tblvalues
    )
    DELETE FROM CTE WHERE RN > 1
    

    这样,您可以为每个 id 分别删除重复的 valueid 值。列data 确定删除哪些重复项。

    【讨论】:

      猜你喜欢
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 2016-12-28
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      相关资源
      最近更新 更多