2017-10-17 39 views
1

我试图让每组的最小值和最大值的行相匹配的下一行开始日期集团由以前的日期值

输入一个日期结束日期:

ResultUid BeginDate     EndDate 
1   1999-12-31 00:00:00.000 2000-01-31 00:00:00.000 
1   2000-01-31 00:00:00.000 2000-02-29 00:00:00.000 
1   2000-02-29 00:00:00.000 2000-03-31 00:00:00.000 
1   2000-03-31 00:00:00.000 2000-04-30 00:00:00.000 
1   2007-03-31 00:00:00.000 2007-04-30 00:00:00.000 
1   2007-04-30 00:00:00.000 2007-05-31 00:00:00.000 
1   2007-05-31 00:00:00.000 2007-06-30 00:00:00.000 

所需的结果:

ResultUid BeginDate     EndDate 
1   1999-12-31 00:00:00.000 2000-04-30 00:00:00.000 
1   2007-03-31 00:00:00.000 2007-06-30 00:00:00.000 

我已经试过:

SELECT 
    ResultUid, 
    MIN(BeginDate) AS "min", 
    MAX(EndDate) AS "max", 
    lag 
FROM (
    SELECT 
     ResultUid, 
     BeginDate, 
     EndDate, 
     DATEDIFF(MONTH,lag(BeginDate) OVER (order by EndDate), EndDate) AS "lag" 
    FROM Results 
    GROUP BY 
     ResultUid, 
     BeginDate, 
     EndDate 
) sub 
GROUP BY 
    ResultUid, 
    lag 

回答

2

您可以通过检查上一个结束日期来确定组的起始位置。然后,相邻日期的组可以通过累积总和来分配组ID:

select resultuid, min(begindate) as begindate, max(enddate) as enddate 
from (select r.*, 
      sum(case when prev_enddate = begindate then 0 else 1 end) over 
       (partition by resultuid order by begindate) as grp 
     from (select r.*, 
        lag(enddate) over (partition by resultuid order by begindate) as prev_enddate 
      from results r 
      ) r 
    ) r 
group by resultuid, grp;