#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;