如何在Snowflake中生成两个时间戳间的所有小时级时间戳?
在Snowflake中生成指定时间范围内的小时级时间序列
方法一:使用GENERATOR函数(性能优先)
这是Snowflake中生成时间序列最高效的方式,适合大多数场景:
WITH time_bounds AS ( SELECT MIN(your_timestamp_col) AS min_ts, MAX(your_timestamp_col) AS max_ts FROM your_table_name ) SELECT DATEADD(HOUR, seq4(), min_ts) AS hourly_timestamp FROM time_bounds, TABLE(GENERATOR(ROWCOUNT => (SELECT DATEDIFF(HOUR, min_ts, max_ts) + 1 FROM time_bounds))) WHERE DATEADD(HOUR, seq4(), min_ts) <= max_ts;
- 先通过
time_boundsCTE获取目标表时间列的最小、最大值 GENERATOR生成刚好覆盖时间范围的行数(小时差+1,确保首尾都包含)seq4()生成连续整数,配合DATEADD逐小时递增生成时间序列- 最后过滤避免因边界计算产生的超出最大时间的行
方法二:使用递归CTE(逻辑直观)
如果更倾向于理解递归逻辑,可以用这种方式:
WITH RECURSIVE hourly_series AS ( SELECT MIN(your_timestamp_col) AS hourly_ts FROM your_table_name UNION ALL SELECT DATEADD(HOUR, 1, hourly_ts) FROM hourly_series WHERE DATEADD(HOUR, 1, hourly_ts) <= (SELECT MAX(your_timestamp_col) FROM your_table_name) ) SELECT hourly_ts FROM hourly_series;
- 初始查询获取时间范围的起始点(最小时间戳)
- 递归部分每次将上一个时间加1小时,直到达到最大时间戳为止
- 最终返回完整的小时级时间序列
注意事项
- 替换代码中的
your_timestamp_col为表中实际的时间列名,your_table_name为目标表名 - 若需要将起始时间对齐到整点(比如原最小时间是10:25,想要从10:00开始),可以把
MIN(your_timestamp_col)替换为DATE_TRUNC('HOUR', MIN(your_timestamp_col)) - 当时间跨度极大时,GENERATOR方法的性能显著优于递归CTE
内容的提问来源于stack exchange,提问作者Felipe Hoffa
相关产品推荐
相关产品推荐

