SQL根据日期差异删除行

时间:2016-02-29 22:35:03

标签: sql-server

标题中表达的情况非常复杂。一个例子应该更容易理解。

我的表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),所以它会被删除。

有干净的方法吗?

1 个答案:

答案 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子句。