2017-10-17 2 views
1

Je suis en train d'obtenir le min et les lignes maximum par groupe avec une date de fin correspondant aux lignes suivantes Date de débutGroupe par date précédente des valeurs

Date de l'entrée:

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 

Résultat souhaité:

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 

J'ai essayé:

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 

Répondre

2

Vous pouvez déterminer où un groupe commence en vérifiant la date de fin précédente. Ensuite, les groupes de dates adjacentes peuvent se voir attribuer un identifiant de groupe en prenant une somme cumulative:

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;