如果任何SQL专家能指出我正确的方向,这将是一个巨大的帮助。我正在学习SQL,并希望创建一个报告,该报告将在
例如,此代码会提取具有多个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相同时进行比较。
答案 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