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

Snowflake SQL编译错误:CASE内嵌窗口函数出现无效group by表达式问题

错误根因

你遇到的编译错误和CASE语句中调用窗口函数无关,核心触发原因是你同时使用了DISTINCT和包含CASE表达式的窗口聚合函数,Snowflake解析器会将窗口函数内的CASE表达式判定为需要参与去重逻辑的非聚合列,因此抛出了无效GROUP BY表达式的报错。另外你贴出的原始代码中properties.property_id后缺少逗号,属于笔误,实际运行时需要补上。

完全可以保留原有MAX逻辑,不需要强制使用QUALIFY子句

最推荐方案:移除多余的DISTINCT,改用普通聚合

你原本的逻辑是要统计每个property_id下NORMAL类型的unit_count最大值,没有NORMAL类型则返回0,直接用普通分组聚合即可实现,写法更简洁也不会有非预期过滤:

SELECT
    properties.property_id,
    COALESCE(MAX(CASE
                     WHEN units_count.unit_type = 'NORMAL' THEN units_count.unit_count
                 END),
            0)::INT AS normal_units_count
FROM units_count
JOIN properties ON units_count.property_id = properties.property_id
GROUP BY properties.property_id

方案2:保留窗口函数写法的改法

如果你后续需要在同一个查询中增加其他窗口计算逻辑,必须保留窗口函数写法,可以把窗口计算放到内层子查询,外层再做去重即可避开编译错误:

SELECT DISTINCT 
    property_id,
    normal_units_count
FROM (
    SELECT
        properties.property_id,
        COALESCE(MAX(CASE
                         WHEN units_count.unit_type = 'NORMAL' THEN units_count.unit_count
                     END) OVER (PARTITION BY properties.property_id),
                0)::INT AS normal_units_count
    FROM units_count
    JOIN properties ON units_count.property_id = properties.property_id
) t

你之前修改的QUALIFY方案会过滤掉不符合最大值条件的行,如果你没有特殊的过滤需求,不需要使用该写法,避免影响其他字段的返回结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:15:03