【问题标题】:SQL Impala- Aggregation with analytic function causes group by AnalysisExceptionSQL Impala- 具有分析功能的聚合导致由 AnalysisException 分组
【发布时间】:2020-10-30 23:27:12
【问题描述】:

我有一个查询,我想计算某个产品在其类别中的销售额百分比。因此,我计算每个产品的销售额并使用分析函数并按类别划分。

SELECT product_id, SUM(sales)/(SUM(sales) OVER(PARTITION BY category))
FROM table1 
GROUP BY product_id

我收到此错误消息:

AnalysisException: select list expression not produced by aggregation output (missing from GROUP BY clause?): sum(sales) / ((sum(sales) OVER (PARTITION BY category)))

有谁知道如何解决这个问题以及为什么会这样?

【问题讨论】:

  • product_id 是唯一值吗?因为如果是这样,group by product_id 对我来说没有任何意义。
  • 你能试试SELECT product_id, sales / SUM(sales) OVER(PARTITION BY category) FROM table1;吗?
  • 正确,product_id 是唯一的。如果我这样写,则查询有效: SELECT product_id, SUM(sales) OVER(PARTITION BY category) FROM table1;如果我只写: SELECT product_id, sales / SUM(sales) OVER(PARTITION BY category) FROM table1;它不会只取每个 product_id 的第一个可用销售值吗? (table1 中的每一行都是一个产品和一个日期)。我认为我需要对每个 product_id 在定义的时间段内的销售额求和,然后除以该类别的销售额总和,以获得正确的百分比值。
  • 我不这么认为,但是您可以尝试使用一些值,我的意思是使用一个包含十条记录的小表,然后手动计算预期结果并查看查询产生的结果。这就是我所做的。如果您尝试,请告诉我。

标签: sql group-by impala analytic-functions


【解决方案1】:

我想,我有一个适合你问题的好例子:

表格示例

+----------+---------+---------+--------+
| order_id | cust_id | empl_id | total  |
+----------+---------+---------+--------+
| 1        | c       | 1       | 24.78  |
| 2        | a       | 4       | 28.54  |
| 3        | b       | 3       | 48.69  |
| 4        | b       | 3       | -16.39 |
| 5        | z       | 2       | 29.92  |
| 6        | z       | 3       | 12.50  |
| 7        | a       | 4       | 10.20  |
| 8        | c       | 1       | 5.22   |
+----------+---------+---------+--------+

查询

SELECT order_id, total / (SUM(total) OVER(PARTITION BY cust_id)) AS percentage
FROM orders
ORDER BY order_id;

结果

+----------+------------+
| order_id | percentage |
+----------+------------+
| 1        | 0.82       |
| 2        | 0.73       |
| 3        | 1.50       |
| 4        | -0.50      |
| 5        | 0.70       |
| 6        | 0.29       |
| 7        | 0.26       |
| 8        | 0.17       |
+----------+------------+

如您所见,例如,对于cust_id --> c,有两个值24,785,22,即sum = 30.00percentage24,78 --> 0.825,22 --> 0.17

请检查是否是您想要的。

【讨论】:

    【解决方案2】:

    需要在窗口函数中嵌套聚合函数:

    SELECT product_id, category,
           (SUM(sales) /
            SUM( SUM(sales) ) OVER (PARTITION BY category))
    -------------^ aggregation function
    --------^ window function
           )
    FROM table1 
    GROUP BY product_id, category;
    

    结合聚合和分析函数一开始看起来很奇怪(至少对我来说是这样)。请记住,首先计算聚合函数,因此内部SUM(sales) 是聚合的结果。另一个SUM()是窗口函数。

    【讨论】:

    • 我得到 AnalysisException:选择列表表达式不是由聚合输出产生的(缺少 GROUP BY 子句?):(sum(sales)/sum(sum(sales))OVER(PARTITION BY category))SELECT product_id, ( SUM(sales) / SUM( SUM(sales) ) OVER (PARTITION BY category)) ) FROM table1 GROUP BY product_id。没有 group by 我得到:AnalysisException:选择列表表达式不是由聚合输出产生的(缺少 GROUP BY 子句?):product_id group by 1,2 我得到:AnalysisException:GROUP BY 表达式不能包含聚合函数:2
    • @Energizer1 。 . .您刚刚在group by 中添加了category
    【解决方案3】:

    Impala 似乎不支持这种分析函数,我用子查询解决了:

    SELECT DISTINCT t2.product_id, (t2.sales/t2.tot_sales_cat) AS perc_cat_spend 
    FROM( 
            SELECT t1.product_id, SUM(t1.sales) OVER (PARTITION BY t1.category) AS tot_sales_cat, t4.prod_sales 
            FROM table1 as t1 
            JOIN(   SELECT  t1.product_id, SUM(t1.sales) AS prod_sales 
                    FROM table1 AS t1 
                    GROUP BY 1
                )   AS t4 ON t4.product_id=t1.product_id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2010-11-05
      • 2012-09-09
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多