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
相关产品推荐
相关产品推荐

