2016-02-29 119 views
1

在標題中表達情況相當複雜。一個例子應該更容易理解。SQL根據日期差異刪除行

我的表A

uid  id  ticket   created_date 
001  1  movie  2015-01-23 08:23:16 
002  25  TV  2012-01-13 12:02:20 
003  1  movie  2015-02-01 07:15:36 
004  1  movie  2014-02-15 15:38:40 

我需要實現的是去除出現在31天內即相互之間並保留出現的第一個記錄重複的記錄。所以上面的表格將減少到B

uid  id  ticket   created_date 
001  1  movie  2015-01-23 08:23:16 
002  25  TV  2012-01-13 12:02:20 
004  1  movie  2014-02-15 15:38:40 

因爲A第3行是內第1排第31天,後來出現了比第1行(2015年2月1日VS 2015年1月23日) ,所以它被刪除。

有沒有一個乾淨的方法來做到這一點?

+0

這裏有點不清楚你在這裏試圖做什麼。你只是想刪除每個id的所有行,其中created_date大於該id的最近created_date 31天后?我不得不說,名爲id的列允許重複是有點矛盾的。 –

+0

你可以參考這個線程 http://stackoverflow.com/questions/20960679/sql-server-find-records-that-have-appeared-3-times-in-last-30-days – Amrutha

+0

@SeanLange更新回覆對你的問題。你的問題的答案是肯定的。實際情況是,每個月都會將新記錄插入表格中。有時可能會更改/更新記錄,並將具有相同ID的新記錄插入表中。這種情況只發生在創建舊記錄後的31天內。我想刪除這些重複項。希望這是明確的。 – breezymri

回答

1

我建議以下方法:

SELECT A.uid AS uid 
INTO #tempA 
FROM A 
    LEFT JOIN A AS B 
     ON A.id=B.id AND A.ticket=B.ticket 
WHERE DATEDIFF(SECOND,B.date,A.date) > 0 AND 
     DATEDIFF(SECOND,B.date,A.date) < 31*24*60*60; 

DELETE FROM A WHERE uid IN (SELECT uid FROM #tempA); 

這是假設由「重複的記錄」你的意思是有兩個相同的id以及相同ticket字段的記錄。如果情況並非如此,則應相應調整ON條款。

+0

@breezymri我接受了你的建議編輯。但是,我比MySQL更熟悉MySQL,而且我不確定'DATEDIFF'中的日期是否符合您的要求。如果不是,你會保留最後出現的記錄,而不是先出現的記錄。確保你測試了它的工作方式。 – OscarJ