sql:表达式不在group by key中

ifsvaxew  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(298)

我有一张交易表 t1 在这样的Hive中:

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无法将窗口调用拆分为组。至少有一个组只能依赖于输入列。表达式不在按键“spend”分组中
但是这个专栏 spend 与聚合函数(sum)一起使用,因此我不能按此列分组。如何修复此错误?

9w11ddsr

9w11ddsr1#

嗯。我想你想要:

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;

我不明白你为什么要用窗口函数。

pkbketx9

pkbketx92#

窗口功能不需要 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

相关问题