【问题标题】: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 相关联?

标签: sql sql-server duplicates


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2019-01-28
        • 1970-01-01
        • 2016-01-07
        • 1970-01-01
        • 2019-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多