Snowflake:如何将日期区间行拆分为区间内每日单条记录?
在Snowflake中将日期区间拆分为每日一行的实现方案
在Snowflake中没有PostgreSQL的generate_series函数,但可以通过两种简洁的方式实现日期区间拆分为每日一行的需求,同时保留原行的price信息。
先准备测试数据
CREATE OR REPLACE TABLE test_dates ( start_date DATE, end_date DATE, price INT ); INSERT INTO test_dates VALUES ('2023-05-22', '2023-05-26', 5);
方案一:使用generator生成序列并计算日期
SELECT DATEADD(day, seq4(), t.start_date) AS date, t.price FROM test_dates t, TABLE(generator(rowcount => (SELECT MAX(DATEDIFF(day, start_date, end_date) + 1) FROM test_dates))) WHERE DATEADD(day, seq4(), t.start_date) <= t.end_date;
seq4()生成从0开始的整数序列DATEDIFF(day, start_date, end_date) + 1计算区间总天数,取最大值作为generator的行数上限- 通过
DATEADD逐天累加得到区间内的每个日期,并用WHERE过滤超出当前行end_date的无效日期
方案二:使用SEQUENCE+FLATTEN展开日期序列(推荐)
SELECT f.value AS date, t.price FROM test_dates t, LATERAL FLATTEN(input => SEQUENCE(t.start_date, t.end_date, INTERVAL '1 day')) f;
SEQUENCE(t.start_date, t.end_date, INTERVAL '1 day')直接生成区间内的每日日期数组LATERAL FLATTEN将数组中的每个日期拆分为单独一行,自动关联原行的price信息- 这种写法逻辑清晰,和PostgreSQL的
generate_series用法最贴近
内容的提问来源于stack exchange,提问作者jyablonski
相关产品推荐
相关产品推荐

