SQl-如何在彼此相隔7天的时间内获取重复记录

SQl-如何在彼此相隔7天的时间内获取重复记录,sql,Sql,我有一个表,其中有两列。帐号和日期 我想能够抓住所有重复的帐户号码,其中的日期是在7天内彼此 例如,我的第一个记录是账号123456,日期为2020-04-21。只有在账户号为123456且日期在2020-04-21的7天内的情况下,我才想获取该记录。如果不是,则跳过该记录并继续下一条记录,直到它遍历整个表 我不太确定解决这个问题的方向。如果我正确地遵循了您的建议,您可以使用exists进行筛选: select t.* from mytable t where exists ( sele

我有一个表,其中有两列。帐号和日期

我想能够抓住所有重复的帐户号码,其中的日期是在7天内彼此

例如,我的第一个记录是账号123456,日期为2020-04-21。只有在账户号为123456且日期在2020-04-21的7天内的情况下,我才想获取该记录。如果不是,则跳过该记录并继续下一条记录,直到它遍历整个表


我不太确定解决这个问题的方向。

如果我正确地遵循了您的建议,您可以使用exists进行筛选:

select t.*
from mytable t
where exists (
    select 1
    from mytable t1
    where 
        t1.account_number = t.account_number
        and t1.date >= t.date - interval '7' day
        and t1.date <  t.date
)
您没有告诉您正在运行哪个数据库:上面的查询使用标准的ANSI SQL日期语法—并非所有数据库都支持这种语法。您可能需要调整数据库的语法


你说的7天之内是什么意思也不清楚。检查在前7天内是否存在具有相同账号的记录;您可能还需要根据您对7天内的定义进行调整。

我认为您可以将表加入到自身中,并最终得到如下结果:

未经测试


按照原始标记在SQL Server上工作

假设表结构

创建表trans Idx INT IDENTITY1,1,账号VARCHAR6,tdate DATE 根据您的问题提供数据

插入trans accountnumber,tdate 值“123456”、“2020-04-21”, '654321', '2020-04-21', '123456', '2020-04-19'. '654321', '2020-04-22' 现在有一个表和一些数据要处理

现在要输出结果,首先需要选择表

从trans a中选择* 接下来,将使用内部联接返回到同一个表

通过a.accountnumber=b.accountnumber SQL加入将删除所有不完全匹配的结果

a.AccountNumber=b.AccountNumber上的内部联接事务b 然后,为了仅在7天内获得结果,您可以使用表a中的介于和之间的日期,应用DATEDIFF-7和DATEDIFF+7来获得事务双方的7天

b、 t日期介于DATEADDd,-7,a.tdate和DATEADDd,7,a.tdate之间 最后,为了避免重复,请确保事务只返回一个尚未使用以下命令检查的结果

和b.Idx>a.Idx 这将避免重复,例如:

账户tDate1 tDate2 123456 2020-04-21 2020-04-19 123456 2020-04-19 2020-04-21 但是,如果出于某种奇怪的原因,第一笔交易实际上是在第二笔交易之后进行的,那么它也允许进行交易。就像我的例子中的数据一样

把这些放在一起,它看起来像这样

选择 a、 帐号, a、 Idx[事务a ID], a、 tdate[交易a日期], b、 Idx[交易b ID], b、 tdate[交易b日期] 来自trans a 内连接变速器b 在a.AccountNumber=b.AccountNumber上 和b.tdate介于DATEADDd,-7,a.tdate和DATEADDd,7,a.tdate之间 和b.Idx>a.Idx 希望这有帮助,这里有一些链接来帮助澄清这一切

如果您使用的是不同的SQL实例,例如MySQL,请让我们知道,以便我们可以修改正确的答案


祝你好运

请提供示例数据、所需结果和适当的数据库标记。对于未指定dbms的问题,请提供特定于产品的答案。至少告诉我们这是为哪个数据库管理系统设计的。这实际上并不能满足要求。如果T1.Date小于T2.Date-7天,那么它将只生成T1.Date正好在T2.Date之前7天的结果,而不是要求的7天内的结果。同样,根据这个概念,T1.Date总是小于T2.Date,所以T1.Date@Simon谢谢。我敢说这是未经测试的。我搞砸了。我已经更改了我的答案-最后一行是now和T1.Date>dateadddd,-7,T2.Date。有很多方法可以在7天内指定。可以在两个日期之间使用datediff和dateadd。可能不希望间隔+7天或-7天-这只会产生重复集。谢谢@avery_larry,我没有考虑这些重复集。答案经过编辑以处理这些问题。
select T1.AccountNumber, T1.Date DateT1, T2.Date DateT2
from YourTable T1
inner join YourTable T2
   on T1.AccountNumber = T2.AccountNumber
   and T1.Date <= T2.Date
   and T1.Date > dateadd("dd", -7, T2.Date)