Sql 查找第一个事件和后续事件
我有下表,我想回报2014年第一次来的人,他们在第一次访问后2个月内以及在第一次访问后不到13个月内进行了后续访问Sql 查找第一个事件和后续事件,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下表,我想回报2014年第一次来的人,他们在第一次访问后2个月内以及在第一次访问后不到13个月内进行了后续访问 ID firstname surname dob event_key event_date status 1 Mark Zeus 12-Dec-67 10 02-Feb-14 Appointment 1 Mark Zeus 12-Dec-67 10 02-Feb-14 Attend 1 Mark Zeus
ID firstname surname dob event_key event_date status
1 Mark Zeus 12-Dec-67 10 02-Feb-14 Appointment
1 Mark Zeus 12-Dec-67 10 02-Feb-14 Attend
1 Mark Zeus 12-Dec-67 11 06-Jul-14 Appointment
1 Mark Zeus 12-Dec-67 11 06-Jul-14 Attend
1 Mark Zeus 12-Dec-67 12 23-Nov-14 Appointment
1 Mark Zeus 12-Dec-67 12 23-Nov-14 Attend
1 Mark Zeus 12-Dec-67 13 23-Nov-14 Appointment
1 Mark Zeus 12-Dec-67 13 23-Nov-14 Attend
2 Jane Adams 24-Jul-57 14 15-Mar-15 Appointment
2 Jane Adams 24-Jul-57 14 15-Mar-15 Attend
2 Jane Adams 24-Jul-57 15 20-Apr-14 Appointment
2 Jane Adams 24-Jul-57 15 20-Apr-14 Attend
2 Jane Adams 24-Jul-57 16 04-Jan-15 Appointment
2 Jane Adams 24-Jul-57 16 04-Jan-15 Attend
3 Rohan Clark 05-Jan-78 17 22-Apr-09 Appointment
3 Rohan Clark 05-Jan-78 17 22-Apr-09 Attend
3 Rohan Clark 05-Jan-78 19 21-Mar-14 Appointment
3 Rohan Clark 05-Jan-78 19 21-Mar-14 Attend
3 Rohan Clark 05-Jan-78 20 30-Jun-15 Appointment
3 Rohan Clark 05-Jan-78 20 30-Jun-15 Attend
3 Rohan Clark 05-Jan-78 21 01-Jan-16 Appointment
3 Rohan Clark 05-Jan-78 21 01-Jan-16 Attend
4 James Gohan 03-Jun-78 22 17-Aug-14 Appointment
4 James Gohan 03-Jun-78 22 17-Aug-14 Attend
4 James Gohan 03-Jun-78 23 30-Dec-14 Appointment
4 James Gohan 03-Jun-78 23 30-Dec-14 Attend
4 James Gohan 03-Jun-78 24 03-Mar-15 Appointment
4 James Gohan 03-Jun-78 24 03-Mar-15 Attend
4 James Gohan 03-Jun-78 25 12-Apr-16 Appointment
4 James Gohan 03-Jun-78 25 12-Apr-16 Attend
5 Isabel Robyn 07-Jul-56 26 07-Jul-15 Appointment
5 Isabel Robyn 07-Jul-56 26 07-Jul-15 Attend
5 Isabel Robyn 07-Jul-56 27 12-May-16 Appointment
5 Isabel Robyn 07-Jul-56 27 12-May-16 Attend
5 Isabel Robyn 07-Jul-56 28 18-Feb-17 Appointment
5 Isabel Robyn 07-Jul-56 28 18-Feb-17 Attend
下面是我的问题,它不起作用
SELECT *
FROM #temp t1
WHERE t1.[event_date] BETWEEN '01-Jan-2014' AND '31-Dec-2016'
AND t1.[ID]
IN
(
SELECT DISTINCT t2.[ID]
FROM #temp t2
WHERE t2.[event_date] <= DATEADD(month, 13, t2.[event_date]) AND t2.[event_date] >= DATEADD(month, 2, [event_date])
)
ORDER BY t1.[ID], t1.[event_key]
-- DROP TABLE #temp
您可以使用一个嵌套表返回第一次访问的所有人,并将其他访问与之进行比较
select distinct t1.id from Table1 t1 inner join
(select id, min(event_date) firstVisit from Table1
group by id
having min(event_date) between '2014-01-01' and '2014-12-31') t2
on t2.id=t1.id
where DATEDIFF(MONTH,t2.firstVisit,t1.event_date) > 2
and DATEDIFF(MONTH,t2.firstVisit,t1.event_date) < 13
我将使用条件聚合来实现这一点:
select id
from (select t.*,
row_number() over (partition by id order by event_date) as seqnum
from #temp t
) t
group by id
having year(min(event_date)) = 2014 and
max(case when seqnum = 2 then event_date end) >= dateadd(month, 2, event_date) and
max(case when seqnum = 2 then event_date end) < dateadd(month, 13, event_date);
嗨,谢谢你的意见。只是一个简单的例子,我怎么能每个ID都有唯一的行呢?再次感谢,是的,它确实返回唯一ID,而不是所有列。如果有意义的话,我希望返回ID以及所有相关列。Regardsy您可以沿idHi将所需字段添加到select语句中,感谢您的输入。只是一个简单的例子,我怎么能每个ID都有唯一的行呢?Thanks@RomainHapi . . . 我不明白你的问题。这会为每个id返回一行。您好,是的,它会返回唯一的id,而不是所有列。如果有意义的话,我希望返回ID以及所有相关列。当做
select id
from (select t.*,
row_number() over (partition by id order by event_date) as seqnum
from #temp t
) t
group by id
having year(min(event_date)) = 2014 and
max(case when seqnum = 2 then event_date end) >= dateadd(month, 2, event_date) and
max(case when seqnum = 2 then event_date end) < dateadd(month, 13, event_date);