SQL Impala - Агрегация с функцией analyti c вызывает группировку по AnalysisException - PullRequest
2 голосов
/ 10 июля 2020

У меня есть запрос, по которому я хочу рассчитать процент продаж определенного продукта в его категории. Таким образом, я подсчитываю объем продаж для каждого продукта и использую функцию аналитики c и делю ее по категориям.

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)))

Любой, кто знает, как решить эту проблему и почему это происходит?

Ответы [ 3 ]

3 голосов
/ 10 июля 2020

Думаю, у меня есть хороший пример, который соответствует вашему вопросу:

Пример таблицы

+----------+---------+---------+--------+
| 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,78 и 5,22, которые sum = 30.00 и percentage это 24,78 --> 0.82 и 5,22 --> 0.17

Пожалуйста проверьте, если это то, что вы хотите.

0 голосов
/ 16 июля 2020

Impala, похоже, не поддерживает функции аналитики c таким образом, я решил с помощью подзапросов:

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;
0 голосов
/ 10 июля 2020

Вам нужно вложить функцию агрегирования в оконную функцию:

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

Объединение функций агрегирования и анализа c сначала выглядит странно (по крайней мере, для меня). Просто помните, что сначала оцениваются функции агрегирования, поэтому внутренний SUM(sales) является результатом агрегирования. Другой SUM() - оконная функция.

...