如何在Snowflake查询中动态展示最近18周数据?
Snowflake 动态筛选最近18周数据的可行方案
核心实现方案
根据业务需求的不同,有两种常用的写法:
1. 筛选包含当前周的18个完整日历周
如果需要严格按周边界(比如周一到周日)划分,确保取到整整18个周的数据,用DATE_TRUNC对齐周起始日:
-- 周起始为周一(符合多数业务逻辑),若需默认周日起始则删除WEEK_START参数 SELECT * FROM your_table WHERE event_date >= DATEADD(WEEK, -17, DATE_TRUNC('WEEK', CURRENT_DATE(), WEEK_START => 1))
逻辑说明:DATE_TRUNC('WEEK', ...)得到当前周的起始日,减去17周后得到18周前的周起始日,区间覆盖从该日到当前的所有日期,正好包含18个完整周。
2. 筛选当前日期往前推18周内的所有数据
如果不需要严格对齐周边界,只要取过去18周(126天)内的所有数据,直接用DATEADD即可:
-- 针对DATE类型字段 SELECT * FROM your_table WHERE event_date >= DATEADD(WEEK, -18, CURRENT_DATE()) -- 针对TIMESTAMP/TIMESTAMP_TZ类型字段 SELECT * FROM your_table WHERE event_timestamp >= DATEADD(WEEK, -18, CURRENT_TIMESTAMP())
为什么你的DATEADD之前没成功?排查这些坑
- 周起始日不匹配:Snowflake默认周起始为周日,若你的业务以周一为周初,直接用
DATEADD会导致区间少算周一到周日的部分,需在DATE_TRUNC中指定WEEK_START => 1 - 字段类型不兼容:如果时间字段是
TIMESTAMP,却用CURRENT_DATE()做计算,会触发隐式转换导致筛选偏差,需对应使用CURRENT_TIMESTAMP() - 参数方向错误:误写为
DATEADD(WEEK, 18, ...)会取未来18周的数据,而非过去的 - 时区不一致:若数据是带时区的
TIMESTAMP_TZ,需确保CURRENT_TIMESTAMP()使用与数据一致的时区,比如CURRENT_TIMESTAMP('Asia/Shanghai')
内容的提问来源于stack exchange,提问作者Tejas Thakur
相关产品推荐
相关产品推荐

