我有一个类似于以下的数据表:
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平台上。
将
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;