Как объединить последовательную дату в одну дату?

#sql #amazon-redshift

#sql #amazon-redshift

Вопрос:

У меня есть данные, которые выглядят следующим образом :

 invalid 43090   2017-08-01  2017-09-01
invalid 43090   2019-11-01  2019-12-01
invalid 43090   2019-12-01  2020-01-01
invalid 43090   2020-01-01  2020-02-01
invalid 43090   2020-02-01  2020-03-01
invalid 43090   2020-03-01  2020-04-01
invalid 43090   2020-04-01  2020-05-01
invalid 43090   2020-05-01  2020-06-01
invalid 43090   2020-06-01  2020-07-01
invalid 43090   2020-07-01  2020-08-01
  

я хочу объединить последовательные даты в одну дату, как показано ниже:

 invalid 43090 1 2017-08-01 2017-09-01
invalid 43090 2 2019-11-01 2020-08-01
  

Есть идеи, как я могу добиться этого в sql. Я использую redshift.

Ответ №1:

Это тип проблемы пробелов и островов. Вы можете использовать lag() и совокупную сумму для определения группировок. Затем агрегировать:

 select col1, col2, min(col3), max(col4)
from (select t.*,
             sum(case when prev_col4 = col3 then 0 else 1 end) over
                 (partition by col1, col2
                  order by col3
                  rows between unbounded preceding and current row
                 ) as grp
      from (select t.*,
                   lag(col4) over (partition by col1, col2 order by col3) as prev_col4
            from t
            ) t
     ) t
group by col1, col2, grp;