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日) ,所以它被删除。
有没有一个干净的方法来做到这一点?
答
我建议以下方法:
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
这里有点不清楚你在这里试图做什么。你只是想删除每个id的所有行,其中created_date大于该id的最近created_date 31天后?我不得不说,名为id的列允许重复是有点矛盾的。 –
你可以参考这个线程 http://stackoverflow.com/questions/20960679/sql-server-find-records-that-have-appeared-3-times-in-last-30-days – Amrutha
@SeanLange更新回复对你的问题。你的问题的答案是肯定的。实际情况是,每个月都会将新记录插入表格中。有时可能会更改/更新记录,并将具有相同ID的新记录插入表中。这种情况只发生在创建旧记录后的31天内。我想删除这些重复项。希望这是明确的。 – breezymri