从表中的多个重复项中删除特定记录

Posted

技术标签:

【中文标题】从表中的多个重复项中删除特定记录【英文标题】:Delete specific record from multiple duplicates in the table 【发布时间】:2019-03-05 16:34:20 【问题描述】:

如何从多个重复项中删除特定记录 下面是表格,例如

这只是其中一个例子,我们有很多这样的案例。我需要从这张表中删除排名 2 和 3。

请建议我识别重复记录和删除特定行的最佳方法

【问题讨论】:

你使用了哪个 dbms 请以文本形式发布数据 您能指定要删除哪些重复项吗?例如,排名较高的那个(与您的问题不匹配) - 顺便说一下,这些并不完全重复,因为排名不同 删除哪一条重复记录重要吗?比如Rank 1和Rank之间为什么建议删除Rank 2,Rank 3和Rank之间为什么是Rank 3? 排名甚至是您数据的一部分吗?另外,我们如何知道 Payroll_no 应该与什么 emp_ID 相关联? 【参考方案1】:

这应该可以工作

delete
from <your table> t
where rank != (select top(rank)
              from <your table> tt
              where tt.emp_id = t.emp_id
               order by rank desc --put asc if you want to keep the lowest rank
               )
group by t.emp_id

【讨论】:

【参考方案2】:

我不鼓励删除记录,但此解决方案可以帮助记录过期或删除它们:

该表应该有一个唯一的 ID 和一个字段,可以让您识别记录已过期。如果没有,我建议将其添加到表中。您可以在查询中创建一个复合 ID,但以后您会希望拥有这些属性。

创建一个查询来标识 RANK 1 的每条记录。这将是您的子查询。

编写您的 UPDATE 查询

UPDATE A
SET [EXPIRE_DTTM] = GETDATE()
FROM *TableNameWithTheRecords* A
INNER JOIN (*SubQuery*) B ON A.UniqueID = B.UniqueID

**如果你真的想删除记录,使用这个:

DELETE FROM *TableNameWithTheRecords* 
WHERE *UniqueID* = (SELECT *UniqueID* FROM *TableNameWithTheRecords* WHERE RANK <> 1)

【讨论】:

【参考方案3】:
 WITH tbl_alias AS
    (
       SELECT emp_ID,
           RN = ROW_NUMBER() OVER(PARTITION BY emp_ID ORDER BY emp_ID)
       FROM tblName
    )
    DELETE FROM tbl_alias WHERE RN > 1

【讨论】:

以上是关于从表中的多个重复项中删除特定记录的主要内容,如果未能解决你的问题,请参考以下文章

使用复选框从表中删除记录[重复]

从表中删除记录,如果其特定值未出现在另一个表中

从表中选择所有或仅特定的行

删除sql视图中的重复记录

从 BigQuery 中删除重复记录

BigQuery 标准 SQL:从表中删除重复项