【问题标题】:Find first occurrence and subsequent occurrences查找第一次出现和后续出现
【发布时间】:2017-03-05 09:07:23
【问题描述】:

我有下表,我想返回 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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您可以有一个嵌套表来返回所有第一次访问的人,并将其他访问与其进行比较。

    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
    

    这会回馈:

    1
    2
    4
    

    【讨论】:

    • 您好,感谢您的意见。只是一个快速的,我怎样才能每个 ID 都有唯一的行?谢谢
    • 您好,是的,它确实返回唯一 ID,而不是所有列。如果有意义的话,我希望返回 ID 以及所有相关列。问候
    • 可以沿着id在select语句中添加需要的字段
    【解决方案2】:

    我会使用条件聚合来做到这一点:

    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 都有唯一的行?谢谢
    • @RomainHapi 。 . .我不明白你的问题。这将返回每个 id 一行。
    • 您好,是的,它确实返回唯一 ID,而不是所有列。如果有意义的话,我希望返回 ID 以及所有相关列。问候
    猜你喜欢
    • 2016-05-10
    • 2018-10-22
    • 1970-01-01
    • 2013-11-03
    • 2021-12-19
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多