SQL:表达式不在 GROUP BY 键中
Posted
技术标签:
【中文标题】SQL:表达式不在 GROUP BY 键中【英文标题】:SQL: Expression Not in GROUP BY Key 【发布时间】:2020-11-18 17:39:38 【问题描述】:我在 Hive 中有一个事务表 t1
,如下所示:
store_id cust_id zip_code transaction_count spend
1000 100 123 3 50
2000 200 456 2 20
我正在尝试使用此表计算一些指标,如下所示:
SELECT
store_id,
zip_code,
SUM(transaction_count) OVER (PARTITION BY store_id, zip_code) / COUNT(*) OVER(PARTITION BY store_id, zip_code) AS avg_transactions,
SUM(spend) OVER(PARTITION BY store_id, zip_code)/SUM(transaction_count) OVER(PARTITION BY store_id, zip_code) AS avg_purchase
FROM
t1
GROUP BY
1, 2
Hive 抛出错误
SemanticException 未能将 Windowing 调用分解为组。至少 1 个组必须仅依赖于输入列。表达式不在 GROUP BY 键 'spend' 中
但是spend
列与聚合函数(sum)一起使用,所以我不能按此列分组。我该如何解决这个错误?
【问题讨论】:
【参考方案1】:窗口函数不需要group by
。你要么想要:
SELECT
store_id,
zip_code,
AVG(transaction_count) OVER(PARTITION BY store_id, zip_code) AS avg_transactions,
SUM(spend) OVER(PARTITION BY store_id, zip_code)
/ SUM(transaction_count) OVER(PARTITION BY store_id, zip_code) AS avg_purchase
FROM t1
请注意,第一个表达式可以缩短为AVG()
。
这会带来与原始表一样多的行。另一方面,如果您希望每个商店和邮政编码只有一行,则使用带有GROUP BY
的常规聚合函数:
SELECT
store_id,
zip_code,
AVG(transaction_count) AS avg_transactions,
SUM(spend) / SUM(transaction_count) AS avg_purchase
FROM t1
GROUP BY store_id, zip_code
【讨论】:
谢谢。快速跟进:假设我想按邮政编码计算每个商店的销售额百分比(“商店 1000 的 20% 的支出用于 zip 123,80% 的支出用于 zip 456”等)。在这里,我们需要每家商店的总销售额作为分母;如果不进行分区,您将如何计算?【参考方案2】:嗯。 . .我想你想要:
SELECT store_id, zip_code, AVG(transaction_count) as avg_transactions,
SUM(spend) / SUM(transaction_count) as avg_purchase
FROM t1
GROUP BY 1, 2;
我不明白你为什么要使用窗口函数。
【讨论】:
以上是关于SQL:表达式不在 GROUP BY 键中的主要内容,如果未能解决你的问题,请参考以下文章
HSQLDB:原因:使用 MAX,但不使用 Group By,并获取 java.sql.SQLSyntaxErrorException:表达式不在聚合或 GROUP BY 列中:
#1055 - SELECT 列表的表达式不在 GROUP BY 子句中,并且包含非聚合列,这与 sql_mode=only_full_group_by 不兼容
org.apache.spark.sql.AnalysisException:表达式 't2.`sum_click_passed`' 既不在 group by 中,也不是聚合函数
Hive 表达式不在 GROUP BY 键 'pat_dtl_start_dt' 中(状态 = 42000,代码 = 10025)