2011-11-10 36 views
2

我正在使用一些SQL頭部劃痕,並且想知道是否有人可以提供幫助。使用這些數據(例如):根據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 

當然,這只是在目前選擇的值,但我基本上打算只是扭轉它的刪除語句。有沒有人有任何想法?

非常感謝! 馬特

回答

2

如何像:

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

謝謝克里斯,完美的工作。使用max()應該是非常明顯的哈哈。不勝感激! –

1

如何:

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) 
+0

謝謝約翰,這種方法可能也適合,但我最終會爲克里斯而去。再次,感謝您的幫助:) –

+0

歡呼的額外評論 - 我從來沒有嘗試過與CTE之前。如果我有名譽,我會給你一個投票。但是你只需要想象一下,在它的意見榮耀中登場! –

+0

我正在曬太陽...... :) – JohnD