2017-01-26 2 views
1

У меня есть таблица sql с людьми и периоды их покрытия. Многие люди имеют несколько записей, и их следует сжимать только там, где охват является непрерывным. Значения - это varchars, но я могу изменить что-то еще.Сочетание покрытия

Name effective termination 
John 20160101 20160315 
John 20160316 20160501 
John 20160601 20161101 
John 20160701 20160731 
John 20160801 20161231 

Должно быть

John 20160101 20160501 
John 20160601 20161231 

ответ

1

Вот идея. Определите, где начинается каждая группа охвата. Используйте эту информацию для идентификации групп. Затем агрегация получает то, что вы хотите:

select name, min(effective) as effective, max(termination) as termination 
    from (select t.*, 
       sum(case when tprev.name is null then 1 else 0 end) over (partition by name order by effective) as grp 
     from t left join 
      t tprev 
      on t.name = tprev.name and 
       t.effective = dateadd(day, 1, tprev.termination) 
     ) t 
    group by name, grp; 
+0

Благодарим вас, работает красиво. – lefeal