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)

表达式不在聚合或 GROUP BY 列中 异常

ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列