标题中表达的情况非常复杂。一个例子应该更容易理解。
我的表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-02-01 vs 2015-01-23),所以它会被删除。
有干净的方法吗?
答案 0 :(得分: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
子句。