在窗口函数中使用不在 Group By 中的列,我得到: SQL 编译错误:[COLUMN_A] is not a valid group by expression

Posted

技术标签:

【中文标题】在窗口函数中使用不在 Group By 中的列,我得到: SQL 编译错误:[COLUMN_A] is not a valid group by expression【英文标题】:Using columns in window function that are not in Group By, I get : SQL compilation error: [COLUMN_A] is not a valid group by expression 【发布时间】:2021-04-08 15:16:53 【问题描述】:

我已经看到很多关于这个错误的问题,最接近我的问题的问题(因为它使用窗口函数)是this one


我的问题是我在 windows 函数中使用了未按以下方式分组的列:

SELECT
    Col_A,
    Col_B,
    FIRST_VALUE(Col_C) OVER (PARTITION BY Col_A, Col_B
                            ORDER BY Col_TimeStamp ASC 
                            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
    MAX(Col_D) OVER (PARTITION BY Col_A, Col_B
                            ORDER BY Col_TimeStamp ASC
                            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM mytable
    GROUP BY 
        Col_A,
        Col_B

通过该查询,我收到Col_CCol_DCol_TimeStamp 的错误

SQL 编译错误:[eachColumn] 不是有效的按表达式分组

我知道我可以通过将所有内容添加到 GROUP BY 子句中“使查询正常工作”,但这似乎违背了目的,因为我正在使用一种时间戳来排序。

我有一个庞大的数据集,无法轻易检查它是否真的违背了目的。

只是我偏执还是我错过了什么?

【问题讨论】:

请提供样本数据和期望的结果。 first_value() 有意义,但 max() 不在聚合查询中。 【参考方案1】:

first_value() 有意义,因为每个组只有一个值。但是,max() 没有意义。

我想知道这是不是你真正想要的:

SELECT DISTINCT Col_A, Col_B,
       FIRST_VALUE(Col_C) OVER (PARTITION BY Col_A, Col_B
                                ORDER BY Col_TimeStamp ASC 
                                ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                               ),
       MAX(Col_D) OVER (PARTITION BY Col_A, Col_B)
FROM mytable;

这将返回每个组的 Col_D 的总体最大值。

【讨论】:

谢谢,你是对的!我正在将一些 PySpark 重构为 Snowflake 并将 group by 以定义我的窗口框架,但由于我无法使用它们,我删除了它们,但让 group by...:/

以上是关于在窗口函数中使用不在 Group By 中的列,我得到: SQL 编译错误:[COLUMN_A] is not a valid group by expression的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 使用不在列表中的列对 Group By 语句排序 [重复]

在 SQL 中选择不在 Group By 中的列

Bigquery:选择具有不在group by子句中的任何值的列

在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”

关于mysql group by 的设置

SQL Group By和窗口函数