You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'))

逻辑说明

  1. DATE_TRUNC('week', ..., 'ISO'):将日期截断到ISO周的起始日(ISO周以周一为第一天,且遵循“包含1月4日的周为当年第1周”的规则),确保跨年周的划分符合标准。
  2. DATEADD('week', -4, 当前周起始):计算过去第4个完整周的起始日,DATEADD会自动处理跨年日期计算(比如2024年第1周的起始日是2024-01-01,减4周后得到2023-12-04,即2023年第49周的起始日)。
  3. DATEADD('week', -1, 当前周起始):计算过去第1个完整周的起始日(排除当前周)。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:06:25