Snowflake/SQL跨年周过滤问题:如何筛选过去4个完整周
解决Snowflake中跨年筛选过去4个完整周的问题
你的核心问题出在拼接年份与ISO周数为数值进行比较——这种方式在跨年时会出现数值断裂(比如202401减4得到202397,而实际前几周是202352、202351等,数值上无法匹配)。正确的思路是直接基于日期范围进行筛选,利用Snowflake的日期函数自动处理跨年逻辑,无需硬编码。
解决方案代码
替换你原有的QUALIFY条件,改用ISO周的起始日期进行范围判断:
QUALIFY MIN(DATE_TRUNC('week', DATE(ETA_PUBLISHED), 'ISO')) OVER (PARTITION BY VOYAGE_REF) BETWEEN DATEADD('week', -4, DATE_TRUNC('week', CURRENT_DATE(), 'ISO')) AND DATEADD('week', -1, DATE_TRUNC('week', CURRENT_DATE(), 'ISO'))
逻辑说明
DATE_TRUNC('week', ..., 'ISO'):将日期截断到ISO周的起始日(ISO周以周一为第一天,且遵循“包含1月4日的周为当年第1周”的规则),确保跨年周的划分符合标准。DATEADD('week', -4, 当前周起始):计算过去第4个完整周的起始日,DATEADD会自动处理跨年日期计算(比如2024年第1周的起始日是2024-01-01,减4周后得到2023-12-04,即2023年第49周的起始日)。DATEADD('week', -1, 当前周起始):计算过去第1个完整周的起始日(排除当前周)。MIN(...) OVER (PARTITION BY VOYAGE_REF):保留你原有的逻辑,确保每个VOYAGE_REF的最早记录所在周属于过去4个完整周的范围。
简化版(无需分组判断)
如果不需要按VOYAGE_REF分组,只需筛选单条记录所在周属于过去4个完整周,可简化为:
QUALIFY DATE_TRUNC('week', DATE(ETA_PUBLISHED), 'ISO') BETWEEN DATEADD('week', -4, DATE_TRUNC('week', CURRENT_DATE(), 'ISO')) AND DATEADD('week', -1, DATE_TRUNC('week', CURRENT_DATE(), 'ISO'))
内容的提问来源于stack exchange,提问作者Odette Deeba
相关产品推荐
相关产品推荐

