如何比较同一个表和同一个帐户下的多行日期

时间:2013-12-04 19:44:27

标签: sql sql-server-2008 tsql compare report

如果任何SQL专家能指出我正确的方向,这将是一个巨大的帮助。我正在学习SQL,并希望创建一个报告,该报告将在相同的人员ID下生成帐户#s,这些人员ID是相互创建的< = 30天,并且排除任何其他人。所需的所有信息都在同一张表中。

例如,此代码会提取具有多个Accountid的相同personid及其创建日期的Person列表:

    select accounttid, creationdate, personid from Table1 where personid in ( 
    select (personid) from Table1 group by personid having COUNT (accountid) > 1)


EXAMPLE RESULT:
    accountid   creationdate    personid
    5501624 2013-05-01  101
    5501544 2013-05-03  101
    5510220 2013-10-24  10337
    5504204 2013-06-27  10337
    5502332 2013-05-21  1047
    5502628 2013-05-28  1047
    5508844 2013-10-01  1047

不知道从哪里开始。我想接下来这些Accountids并以某种方式比较Creationdates小于或等于30天的差异,但只在PersonIDs相同时进行比较。

3 个答案:

答案 0 :(得分:1)

我会使用半连接:

select accountid, creationdate, personid 
from Table1 t1
where EXISTS(
  SELECT 1 FROM Table1 t2
  WHERE t1.personid = t2.personid
    AND t1.accountid <> t2.accountid
    AND t1.creationdate BETWEEN
           t2.creationdate - interval 30 day
        AND
           t2.creationdate + interval 30 day
);

演示 - &gt; http://www.sqlfiddle.com/#!2/2be93/2


---编辑---


在SQL-Server上使用以下条件:

 BETWEEN dateadd( day, -30, t2.creationdate )
     AND
         dateadd( day, 30, t2.creationdate )

这是SQL-Server的查询:

select accountid, creationdate, personid 
from Table1 t1
where EXISTS(
  SELECT 1 FROM Table1 t2
  WHERE t1.personid = t2.personid
    AND t1.accountid <> t2.accountid
    AND t1.creationdate BETWEEN
           dateadd( day, -30, t2.creationdate )
        AND
           dateadd( day, 30, t2.creationdate )
);

demo:----&gt; http://www.sqlfiddle.com/#!3/cc922/4


对您的查询提出一些评论:

select accountid, creationdate, personid 
from Table1 
where personid in ( 
    select personid 
    from Table1 
    group by personid 
    having COUNT(accountid) > 1
);

想一会儿......带有HAVING COUNT的子查询必须为每个人计算一些记录 - 它必须读取整个表(所有行)以获取此信息,因为我们询问{{1 }}。如果这个人拥有10,000个账户,我们需要阅读所有这些账户来计算它们。

但是,我们不需要这些信息,也不需要阅读整个表格。我们需要的是这个问题的答案:give me a number of rows for given person 对于此类查询,我们可以使用if this person has at least 2 accounts运算符:

EXISTS

在此查询中,MySql不需要计算所有记录,也不需要读取整个表。当它找到符合EXISTS运算符内子查询定义的条件的第一条记录时,它会停止读取表。

答案 1 :(得分:0)

select distinct(personid, accountID)
  from Table1 
 where Table1 personid in 
       ( 
        select distinct(t1a.personid)
          from Table1 as t1a 
          join Table1 as t1b
            on t1a.personid = t1b.personid
           and t1a.creationdate < t1b.creationdate
           and datediff(dd, t1a.creationdate, t1b.creationdate) <= 30
       )

答案 2 :(得分:0)

根据personid应该相同且两个creationdate之间的差异大于30天的条件,您可以加入自己得到的结果。

类似的东西:

{select accounttid, creationdate, personid 
 from Table1 where personid in ( 
    select (personid) 
    from Table1 
    group by personid 
    having COUNT (accountid) > 1)} as a 
join 
{select accounttid, creationdate, personid from 
 Table1 where personid in ( 
    select (personid) from 
    Table1 
    group by personid 
    having COUNT (accountid) > 1)} as b 
on a.personid=b.personid and a.creationdate-b.creationdate >= 30