Sql server SQL根据日期差异删除行

Sql server SQL根据日期差异删除行,sql-server,Sql Server,这种情况在标题中表达起来相当复杂。一个例子应该更容易理解 我的表A: 我需要实现的是删除彼此之间在31天内出现的重复记录,并保留最先出现的记录。因此,上表将缩减为B: 因为A中的第三行在第1行的31天内,并且它出现的时间晚于第1行2015-02-01 vs 2015-01-23,所以它被删除 有没有干净的方法可以做到这一点?我建议采用以下方法: SELECT A.uid AS uid INTO #tempA FROM A LEFT JOIN A AS B ON A.id

这种情况在标题中表达起来相当复杂。一个例子应该更容易理解

我的表A:

我需要实现的是删除彼此之间在31天内出现的重复记录,并保留最先出现的记录。因此,上表将缩减为B:


因为A中的第三行在第1行的31天内,并且它出现的时间晚于第1行2015-02-01 vs 2015-01-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和相同票证字段的记录。如果不是这样,您应该相应地调整ON条款。

我不太清楚您在这里想做什么。您是否只想删除每个id的所有行,其中创建日期在该id的最近创建日期之后>31天?我不得不说,一个名为id的列允许重复是有点矛盾的。你可以引用这个线程@SeanLange更新来回答你的问题。你的问题的答案是肯定的。实际上,每个月都会在表中插入新记录。有时可能会更改/更新记录,并将具有相同id的新记录插入表中。此类情况仅在创建旧记录后的31天内发生。我想删除这些重复项。希望这是清楚的。您的第一步是找到“重复”行并检查它们之间的日期。副本是基于身份证还是票证?我将假设ID:SELECT ID,MINuid,MAXuid,mincreated_date,maxcreated_date,datediffed,mincreated_date,maxcreated_date days与一个组不同,因为A中的第三行在第1行的31天之内,并且它出现的时间晚于第1行2015-02-01 vs 2015-01-23,所以它被删除。也许我错了,但这条规则不适用于表的第4行?@breezymri我接受了你建议的编辑。但是,我更熟悉MySQL而不是SQL Server,我不确定DATEDIFF中的日期是否符合您的要求。如果不是,你将保留最后出现的记录,而不是第一个出现的记录。确保您测试它是否按预期工作。
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
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);