Группировка по минимальной и максимальной дате для каждого идентификатора - PullRequest
2 голосов
/ 27 марта 2020

Мне тяжело на SQL. Надеюсь, что каждый может помочь мне в этом. Спасибо!

У меня есть следующий набор данных:

Mike 1/1/2019  4/30/2019  
Mike 5/1/2019  7/31/2019  
Mike 11/1/2019 12/31/2019  
Jen  3/1/2019  5/31/2019  
Jen  6/1/2019  7/31/2019  

Как мне написать скрипт SQL, чтобы я мог получить следующий результат?

Mike 1/1/2019 7/31/2019  
Mike 11/1/2019 12/31/2019  
Jen 3/1/2019 7/31/2019  

Я пытался написать следующий скрипт SQL, но он не дает мне то, что я хочу.

Select Name, min(startdate) as start, max(enddate) as end
from testtable
group by Name

Вместо этого я получаю следующее:

Mike 1/1/2019 12/31/2019  
Jen 3/1/2019  7/31/2019

1 Ответ

1 голос
/ 27 марта 2020

Это тип пробелов и проблема островков. Мне нравится решать эту проблему, получая совокупную максимальную конечную дату для каждой записи. Новый «остров» начинается, когда у этой даты окончания есть разрыв с текущей датой начала:

select name, grp, min(startdate), max(enddate)
from (select t.*,
             sum(case when prev_enddate >= dateadd(day, -1, startdate) then 0 else 1 end) over
                 (partition by name order by startdate) as grp
      from (select t.*,
                   max(enddate) over (partition by name
                                      order by startdate
                                      rows between unbounded preceding and 1 preceding
                                     ) as prev_enddate
            from t
           ) t
     ) t
group by name, grp;

Здесь - это скрипта db <>.

...