2017-09-13 59 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的行。

任何幫助將是偉大的。

注:這是一個有點抽象。實際的表擁有數百萬IDS的有不同的許多重複的ID創建日期

+1

您正在使用哪些DBMS? SQL Server? MySQL的?甲骨文?還有別的嗎? – Siyual

+0

的SQL Server 2008 R2 –

+0

SO是一個偉大的網站提出問題並得到答案:只是一定要提供一個完整的[MCVE(https://stackoverflow.com/help/mcve)。在提出問題之前,請考慮[先與鴨子交談](https://blog.codinghorror.com/rubber-duck-problem-solving/)。是的,我很認真!爲了幫助我們幫助您,請生成樣本數據和預期結果。 [ascii表](https://ozh.github.io/ascii-tables/)使輸出易於閱讀!您還可以模擬數據,並使用http://rextester.com/或類似網站嘗試SQL。幾乎任何事情都是可能的;這是我們應該做的事情;我們不是。 – xQbert

回答

3

您可以使用ROW_NUMBER()來識別具有最近日期的記錄,並刪除其餘:

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

試試這個:

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

對不起,我給你的樣本是一個小小的提取物。實際的表格有數百萬個ID,其中有許多創建日期不同的ID –