在窗口函数中使用不在 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_C
、Col_D
、Col_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 语句排序 [重复]
Bigquery:选择具有不在group by子句中的任何值的列
在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”