SQL根据日期差异删除行

问题描述:

在标题中表达情况相当复杂。一个例子应该更容易理解。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://*.com/questions/20960679/sql-server-find-records-that-have-appeared-3-times-in-last-30-days – Amrutha

+0

@SeanLange更新回复对你的问题。你的问题的答案是肯定的。实际情况是,每个月都会将新记录插入表格中。有时可能会更改/更新记录,并将具有相同ID的新记录插入表中。这种情况只发生在创建旧记录后的31天内。我想删除这些重复项。希望这是明确的。 – breezymri

我建议以下方法:

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