根据连续日期合并 SQL 记录

问题描述 投票:0回答:1

我有一个类似于以下的数据表:

ID    Name    Start       End
10    Value1  2016-01-01  2016-12-31
10    Value1  2017-01-01  2017-12-31
10    Value1  2018-01-01  2018-12-31
10    Value2  2019-01-01  2019-12-31
10    Value2  2020-01-01  2020-12-31
10    Value1  2021-01-01  2021-12-31

我正在尝试编写一个 SQL 语句,该语句将根据名称相同的连续开始日期和结束日期来合并记录,例如

ID    Name    Start       End
10    Value1  2016-01-01  2018-12-31
10    Value2  2019-01-01  2020-12-31
10    Value1  2021-01-01  2021-12-31

按名称(包含最小开始日期和最大结束日期)进行简单分组不起作用,因为名称可能会更改为原始值。任何帮助将不胜感激,谢谢!

这是在Snowflake平台上。

sql database snowflake-cloud-data-platform
1个回答
0
投票

x
CTE 作为您的输入数据,您可以使用
CONDITIONAL_CHANGE_EVENT
函数来存储您的值更改,这是我在
cond
CTE 中完成的。然后,您只需聚合您刚刚创建的
id
value
cond_group
存储桶上的数据即可。

with x as (
    select *
    from (values
            (10,'Value1','2016-01-01'::date,'2016-12-31'::date),
            (10,'Value1','2017-01-01'::date,'2017-12-31'::date),
            (10,'Value1','2018-01-01'::date,'2018-12-31'::date),
            (10,'Value2','2019-01-01'::date,'2019-12-31'::date),
            (10,'Value2','2020-01-01'::date,'2020-12-31'::date),
            (10,'Value1','2021-01-01'::date,'2021-12-31'::date))
            as y (id,value,start_date,end_date)
), cond as (
    select id,
           value,
           start_date,
           end_date,
           CONDITIONAL_CHANGE_EVENT(value) OVER (partition by id ORDER BY start_date) as cond_group
    from x
)
select id, value, min(start_date) as start_date, max(end_date) as end_date
from cond
group by id, value, cond_group;
© www.soinside.com 2019 - 2024. All rights reserved.