Sql 查找第一个事件和后续事件

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

我有下表,我想回报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    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);