【问题标题】:Deleting duplicates based on latest revision in SQL根据 SQL 中的最新版本删除重复项
【发布时间】:2011-11-10 22:15:57
【问题描述】:

我有一点 SQL 头疼的时刻,想知道是否有人可以提供帮助。使用此数据(例如):

workId     rateRevision
1          1
1          2
1          3
2          1
3          1
3          2
4          1
4          2
4          3

...我基本上想删除除了最新版本(最高 rateRevision 值)之外的所有重复项。所以我最终会得到:

workId     rateRevision
1          3
2          1
3          2
4          3

理论上这听起来很简单,但我无法在 SQL 中解决。这是我当前的代码:

SELECT * FROM rate r
WHERE r.rateRevision = 
(select r.rateRevision from rate r ORDER BY r.rateRevision DESC LIMIT 1);

...但这只是返回

workId     rateRevision
4          3

当然,目前这只是选择值,但我计划基本上只是将其反转为删除语句。请问有人有什么想法吗?

非常感谢! 马特

【问题讨论】:

    标签: sql duplicate-removal


    【解决方案1】:

    怎么样:

    delete from rate r where r.rateRevision < (select max(r2.rateRevision) from rate r2 where r.workId = r2.workId)
    

    【讨论】:

    • 谢谢你,克里斯,效果很好。使用 max() 应该是非常明显的哈哈。赞赏!
    【解决方案2】:

    怎么样:

    select workId, MAX(rateRevision) as MaxRevision
    from MyTable
    group by workId
    

    结果:

    workId  MaxRevision
    1       3
    2       1
    3       2
    4       3
    

    克里斯给了你我认为最好和最简单的答案。如果您遇到需要删除重复项的棘手情况(例如,保留 5 个最近的修订,删除所有其他修订),您可以使用 CTE 添加一个序数“行号”,如下所示。

    WITH CTE AS
    (
        SELECT workId, 
               rateRevision,
               ROW_NUMBER() OVER(PARTITION BY workId ORDER BY rateRevision DESC) AS Ordinal
        FROM MyTable
    )
    DELETE FROM CTE
    WHERE Ordinal > 5   -- You can keep the top "N" records (here we are just keeping the top 5)
    

    【讨论】:

    • 谢谢约翰,这种方法可能也很合适,但我最终选择了克里斯。再次感谢您的帮助:)
    • 为附加评论干杯——我以前从未尝试过 CTE。如果我有声望,我会给你投票。但是您将不得不想象沉浸在它投票的荣耀中!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    相关资源
    最近更新 更多