首页 > 解决方案 > 如何将连续日期合并为一个日期?

问题描述

我有一个如下所示的数据:

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 中实现这一点。我正在使用红移。

标签: sqlamazon-redshift

解决方案


这是一种差距和孤岛问题。您可以使用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;

推荐阅读