2017-09-13 8 views
0

私はこのような表を持っています。最高の日付から離れたすべての行を削除

ID | Create Date 
---+------------------------- 
1 | 2007-06-12 15:44:10:000 
1 | 2007-07-12 15:44:10:000 
2 | 2007-06-12 15:44:10:000 
2 | 2007-07-12 15:44:10:000 
2 | 2007-08-12 15:44:10:000 
3 | 2007-09-12 15:44:10:000 
4 | 2012-06-12 15:44:10:000 
5 | 2011-07-12 15:44:10:000 

他のすべての行を削除している間は、max(createdate)を保持する必要があります。私はまたID 3,4,5で行を保持する必要があります。

助けがあれば助かります。

注:これは少し抽象です。

DELETE FROM table 
WHERE ID NOT IN (SELECT ID FROM table 
WHERE ID IN 3, 4, 5 OR ID = (SELECT ID FROM table as a 
          WHERE createdate = (SELECT MAX(createdate) FROM 
           table as b WHERE a.ID = b.ID))) 
+1

どのDBMSを使用していますか? SQLサーバー? MySQL?オラクル?他に何か? – Siyual

+0

Sql server 2008 r2 –

+0

SOは質問をして答えを得る素晴らしいサイトです:完全な[MCVE](https://stackoverflow.com/help/mcve)を提供してください。質問をする前に[最初にアヒルと話をする](https://blog.codinghorror.com/rubber-duck-problem-solving/)を検討してください。そうです。私は本気です!私たちのお手伝いをするために、サンプルデータと期待される結果を生成してください。 [ascii table](https://ozh.github.io/ascii-tables/)は、出力を読みやすくします!データをモックアップすると、SQLはhttp://rextester.com/または類似のサイトを使用して試してみることもできます。かなり多くのことが可能です。それは私たちがそれをするべきかどうかの問題です。私たちはできません。 – xQbert

答えて

3

あなたが最新の日付を持つレコードを識別するためにROW_NUMBER()を使用し、残りの部分を削除することができます。実際のテーブルには、さまざまな作成日付

0

で多くの重複のIDを持っているIDの数百万人はこれを試してみてくださいました。

;With ToDelete As 
(
    Select *, 
      Row_Number() Over (Partition By Id Order By CreateDate Desc) RN 
    From YourTable 
) 
Delete ToDelete 
Where RN <> 1 
+0

申し訳ありませんが、私があなたに与えたサンプルは少し抽出されました。実際のテーブルには、作成日の異なる多くのデリゲートIDを持つ数百万のIDがあります –

関連する問題