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

如何在Snowflake中查询各店铺的最大日期及次大日期?

解决Snowflake中按店铺获取最大/次大日期的问题

问题原因

你之前尝试的子查询WHERE FILE_DATE < (SELECT MAX(FILE_DATE) FROM "PRODUCTS" GROUP BY UPPER(RETAILER))无效,是因为该子查询返回每个店铺的最大日期(多行结果),而WHERE子句无法直接将单个值与多行结果做比较,导致逻辑错误。

解决方案:使用窗口函数实现

在Snowflake中,用窗口函数是最简洁高效的处理方式,以下提供两种可行写法:

写法一:基于排名筛选次大日期

SELECT
    SHOP,
    MAX_DATE,
    2nd_MAX_DATE
FROM (
    SELECT
        UPPER(RETAIL) AS SHOP,
        FILE_DATE AS 2nd_MAX_DATE,
        -- 直接获取当前店铺的最大日期
        MAX(FILE_DATE) OVER (PARTITION BY UPPER(RETAIL)) AS MAX_DATE,
        -- 按店铺分组,日期降序排名,1=最大日期,2=次大日期
        ROW_NUMBER() OVER (PARTITION BY UPPER(RETAIL) ORDER BY FILE_DATE DESC) AS date_rank
    FROM PRODUCTS
) ranked_dates
WHERE date_rank = 2
ORDER BY SHOP;

写法二:条件聚合直接提取结果

SELECT
    UPPER(RETAIL) AS SHOP,
    MAX(FILE_DATE) AS MAX_DATE,
    -- 筛选排名第2的日期作为次大值
    MAX(CASE WHEN date_rank = 2 THEN FILE_DATE END) AS 2nd_MAX_DATE
FROM (
    SELECT
        FILE_DATE,
        UPPER(RETAIL),
        ROW_NUMBER() OVER (PARTITION BY UPPER(RETAIL) ORDER BY FILE_DATE DESC) AS date_rank
    FROM PRODUCTS
) t
GROUP BY UPPER(RETAIL)
ORDER BY SHOP;

特殊场景适配

如果店铺存在多个相同的最大日期(比如同一天有多条记录),可以将ROW_NUMBER()替换为DENSE_RANK(),避免跳过排名,确保次大日期是真正的第二大值。

内容的提问来源于stack exchange,提问作者Ronron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:20:27