2014-10-08 34 views
0

我有以下數據:SQL查詢保留最多2個重複記錄

 Name ID Date 
     Dave | 123 | 1-2-2011 
     Jim | 123 | 1-3-2011 
     Mike | 123 | 1-10-2011 
     Bill | 111 | 1-2-2011 
     Henry | 222 | 1-3-2011 
     Larry | 222 | 1-4-2011 

我需要刪除查詢此降低:

 Jim | 123 | 1-3-2011 
    Mike | 123 | 1-10-2011 
    Bill | 111 | 1-2-2011 
    Larry | 222 | 1-4-2011 

即我想保留兩個最新記錄爲每個ID。

我嘗試這樣做:

Delete FROM UserTable a 
WHERE 
Date <> (SELECT MAX(Date) FROM UserTable b WHERE a.ID = b.ID) 
AND ID IN (SELECT ID FROM UserTable GROUP BY ID HAVING COUNT(*) > 1) 

但只保留最新的1分獨特的記錄。

+0

我不是你問清楚的記錄。 「2個最新記錄是重複的」是什麼意思?什麼將記錄定義爲「獨特」(不應該以某種方式通過唯一記錄來記錄所有記錄?我不明白爲什麼Dave的記錄不在輸出中,而Bill則是。 – 2014-10-08 14:03:31

+0

在問題中包含您的查詢會有幫助 – 2014-10-08 14:04:22

+1

我認爲該帖子要求爲每個(col2)最近的2個條目(col3)組成一個集合,但我不確定這個主題與此有什麼關係,因爲5可能因記錄數量而異。 。 – xQbert 2014-10-08 14:06:40

回答

0

嘗試類似的東西:

SELECT col1, col2, col3, COUNT(*) 
FROM (SELECT DISTINCT * FROM your_TableName) AS T1 
GROUP BY col2, col3 
+0

這是如何限制結果的,因此每個不同的col2值只有2條記錄? – xQbert 2014-10-08 17:44:17

0

嘗試使用下面這取決於你想請求嘗試使用ASC或DESC

SELECT column_name,column_name 
FROM table_name 
ORDER BY column_name,column_name ASC|DESC; 

嘗試也是對你的SQL閱讀了一下這個代碼http://www.w3schools.com/sql/sql_orderby.asp

+0

這將如何限制結果,以便每個不同的col2值只有2條記錄? – xQbert 2014-10-08 17:43:41

+0

您可以使用最大功能或更大/更小/等於符號來限制。並只選擇你想要調用的列。希望我明白你在說什麼並正確回答你的問題......你應該在這裏找到更多的幫助http://www.w3schools.com/sql/ – 2014-10-09 05:58:32

0

分區可用於保留多個副本。

delete from UserTable 
where (id, date) in ( 
     select id,date from (
      select id,date, 
        row_number() over (partition by id order by date desc) as temp 
      from UserTable) 
     where temp > 2 
); 

這個查詢增加了行號爲另一列由ID劃分,按日期排序,然後刪除那些具有行數大於2