2011-11-10 14 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値)を除くすべての重複を削除したいです。理論的には、それは本当に簡単に聞こえるが、私はSQLでそれを動作することはできません

workId  rateRevision 
1   3 
2   1 
3   2 
4   3 

:だから私は、で終わるだろう。ここに私の現在のコードです:

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

Johnさん、ありがとう、この方法もおそらく適切でしたが、私はChris 'に行くことになりました。もう一度、助けてくれてありがとう:) –

+0

追加のコメントのための歓待 - 私は以前にCTEで実験したことはありません。もし私の評判があれば、私はあなたに投票をします。しかし、あなたは賞賛の栄光を浴びることを想像しなければなりません! –

+0

私は離れていきます。:) – JohnD

関連する問題