Snowflake:SQL 编译错误:不是有效的 group by 表达式

Posted

技术标签:

【中文标题】Snowflake:SQL 编译错误:不是有效的 group by 表达式【英文标题】:Snowflake: SQL compilation error: not a valid group by expression 【发布时间】:2021-09-30 16:06:06 【问题描述】:

我正在尝试在 case 语句中调用窗口函数,如下所示:

SELECT
    DISTINCT 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

我收到以下错误:

SQL compilation error: [IFF(UNITS_COUNT.UNIT_TYPE = 'NORMAL', UNITS_COUNT.UNIT_COUNT, SYSTEM$NULL_TO_FIXED(null))] is not a valid group by expression

我尝试添加限定子句以删除 MAX() 函数:

SELECT
    DISTINCT properties.property_id
    COALESCE(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
QUALIFY units_count.unit_count = MAX(units_count.unit_count) OVER (PARTITION BY properties.property_id)

代码执行,但限定子句导致对其他字段进行不必要的过滤。我可以保留现有逻辑(使用MAX())还是需要包含限定子句?

【问题讨论】:

您能否详细说明这一点:“...但是qualify 子句会导致对其他字段进行不必要的过滤。” 【参考方案1】:

DISTINCT 实际上是一个分组操作,但您的 MAX 是一个带有 OVER 子句的每一行。

这意味着“基本 SQL”应该可以工作:

SELECT 
    p.property_id,
    MAX(IFF(uc.unit_type = 'NORMAL', uc.unit_count, 0)) as v1 max_units_count
FROM units_count AS uc
JOIN properties AS p 
    ON uc.property_id = p.property_id
GROUP BY 1

但是由于您的“其他领域”意味着您正在选择其他事物并且不知道您在做什么/如何做,所以很难看到您想要做什么。

你的max(unit_count) 也不觉得它是一个 normal_unit_count。

但是您的示例需要在第二列中添加您想要执行的操作,以了解如何共同处理它们。但我倾向于使用零信息来建议您使用 CTE 来查找每个 property_id 和 MAX unit_count,然后将该结果加入到第二次读取数据中。因为对其他操作以及他们如何重用该读取的零洞察力,我已经体验到 GROUP/JOIN 然后 WINDOW(over partition)/ANYVALUE 更好。但这是另一种选择。

因此(未经测试)这可能有效:

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

【讨论】:

以上是关于Snowflake:SQL 编译错误:不是有效的 group by 表达式的主要内容,如果未能解决你的问题,请参考以下文章

SQL 编译错误:无法在 Snowflake 中评估不受支持的子查询类型

将 CSV 文件从 S3 加载到 Snowflake 时出现 SQL 编译错误

SQL 编译错误:从 S3 复制到 Snowflake 时,JSON 文件格式只能生成一列类型变量或对象或数组

雪花; SQL 编译错误:无效的对象类型:GET_DDL 上的“EXTERNAL_TABLE”(“DATABASE”,“MyDb”)

SQL编译错误--使用python进行Snowsql验证

Snowflake 中的返回类型“Table”问题