Ошибка Impala: AnalysisException: выберите выражение списка, не созданное выходными данными агрегации (отсутствует в предложении GROUP BY?):

Это мой первый пост. надеюсь понятно буду :)

Пытаюсь запустить на импале (используя Hue) следующий запрос во 2 версии.

Версия 1 (сгруппировать по 1):

SELECT payment_method,
       (CASE WHEN price <= 1000 AND country = 'israel' THEN  (price+50+0.18*price)/count(Distinct payment_token)/100
            WHEN price <= 1000 AND country <> 'israel' THEN (price+50)/count(Distinct payment_token)/100
            WHEN price > 1000  AND country = 'israel' THEN (price+0.05*price+0.18*price)/100
            ELSE (price+0.05*price)/count(Distinct payment_token)/100
        END) as ASP
FROM traffic_db.traffic_parq
WHERE year = 2016 AND month = 1
Group by 1

Error 1: AnalysisException: select list expression not produced by aggregation output (missing from GROUP BY clause?): CASE WHEN price... (rest of case when statment)

Версия 2 (группа по 1,2):

SELECT payment_method,
       (CASE WHEN price <= 1000 AND country = 'israel' THEN  (price+50+0.18*price)/count(Distinct payment_token)/100
            WHEN price <= 1000 AND country <> 'israel' THEN (price+50)/count(Distinct payment_token)/100
            WHEN price > 1000  AND country = 'israel' THEN (price+0.05*price+0.18*price)/100
            ELSE (price+0.05*price)/count(Distinct payment_token)/100
        END) as ASP
FROM traffic_db.traffic_parq
WHERE year = 2016 AND month = 1
Group by 1,2

Error: AnalysisException: GROUP BY expression must not contain aggregate functions: 2

Я не знаю, в чем проблема. ПРИМЕЧАНИЕ. Если я запускаю оператор CASE-WHEN с невычисленными значениями - он работает нормально (когда я группирую также по оператору case-when).

Кто-нибудь сталкивался с такой проблемой?


person shayms8    schedule 07.02.2016    source источник


Ответы (1)


Проблема с этим запросом:

SELECT payment_method,
       (CASE when ftb = true THEN 'FTB' ELSE 'Repeat' end) as FTB_Repeat,
       (CASE WHEN price <= 1000 AND country = 'israel'
             THEN  SUM(price+50+0.18*price)/count(Distinct pay ment_token)/100
             WHEN price <= 1000 AND country <> 'israel'
             THEN SUM(price+50)/count(Distinct payment_token)/100
             WHEN price > 1000  AND country = 'israel'
             THEN SUM(price+0.05*price+0.18*price)/100
             ELSE SUM(price+0.05*price)/count(Distinct payment_token)/100
        END) as ASP,
       COUNT(*)
FROM traffic_db.traffic_parq
WHERE year = 2016 AND month = 1
Group by 1,2;

На самом деле это не пункт GROUP BY. Это дополнительные столбцы в select, которые не являются агрегацией. Вы можете исправить это с помощью:

GROUP BY payment_method, FTB_Repeat, price, count

(Примечание: я не знаю, разрешает ли Impala псевдонимы столбцов в group by.) Ключевым моментом является добавление дополнительных неагрегированных столбцов.

Итак, это может быть целью вашего запроса. Или, возможно, вы хотите условную агрегацию:

SELECT payment_method,
       (CASE when ftb = true THEN 'FTB' ELSE 'Repeat' end) as FTB_Repeat,
       SUM(CASE WHEN price <= 1000 AND country = 'israel'
                THEN  (price+50+0.18*price)/count(Distinct payment_token)/100
                WHEN price <= 1000 AND country <> 'israel'
                THEN (price+50)/count(Distinct payment_token)/100
                WHEN price > 1000  AND country = 'israel'
                THEN (price+0.05*price+0.18*price)/100
                ELSE (price+0.05*price)/count(Distinct payment_token)/100
        END) as ASP,
       COUNT(*)
FROM traffic_db.traffic_parq
WHERE year = 2016 AND month = 1
Group by 1, 2;

Если бы мне пришлось угадывать, это то, что вы пытаетесь сделать.

person Gordon Linoff    schedule 07.02.2016
comment
Привет, спасибо за быстрый ответ :) К сожалению, это не проблема. Impala позволяет агрегировать с псевдонимами (числа). Запрос, который я написал сначала, был ошибкой - это не тот, который я пытаюсь запустить. Я отредактировал реальный запрос - person shayms8; 08.02.2016
comment
@shayms8 . . . Вы не понимаете этого ответа. Попробуйте перечитать. - person Gordon Linoff; 08.02.2016
comment
Привет, Гордон. Думаю, я понял, что вы имели в виду ... просто проблема не в этом: \ Я безуспешно пытался выполнить запросы, которые вы написали. Вы проверили редактирование, которое я сделал? У меня всего 2 столбца - payment_method и вычисляемый столбец. Таким образом, мне нужно сгруппировать только по первому столбцу. Не так ли? Ни один из ваших ответов не сработал X_X Tnx снова за вашу помощь! - person shayms8; 08.02.2016
comment
@shayms8 . . . Вы действительно не понимаете. Вы не можете выполнять агрегирование по второму псевдониму, так как он содержит функции агрегирования (такие как count()). Вам нужно либо использовать условную агрегацию (как во втором из моих запросов), либо отделить столбцы в выражении, которые не агрегируются. Есть что-то простое, чего вам не хватает; как-то вы усложняете задачу. - person Gordon Linoff; 08.02.2016
comment
Я понимаю. Я знаю, что означает «Группировать по», и я знаю, что не могу группировать по агрегатным функциям. Я попробовал следующие запросы: `ВЫБЕРИТЕ метод_оплаты, СУММА (СЛУЧАЙ, КОГДА цена = 1000 И страна = «Израиль», ТОГДА (цена + 50 + 0,18 * цена)/количество (Отдельный платежный_токен)/100, КОГДА цена ‹ = 1000 И страна ‹ › «Израиль» ТОГДА (цена+50)/количество(Отдельный платеж_токен)/100, КОГДА цена › 1000 И страна = «Израиль» ТОГДА (цена+0,05*цена+0,18*цена)/100 ИНАЧЕ (цена+0,05*цена) /count(Отдельный платежный_токен)/100 END) asp FROM.... WHERE.... Группировать по 1 - person shayms8; 09.02.2016
comment
Что означает вашу условную агрегацию. Не работает. также пробовал обычную группировку по: `ВЫБЕРИТЕ метод_оплаты, СЛУЧАЙ, КОГДА цена ‹= 1000 И страна = 'Израиль' ТОГДА (цена+50+0,18*цена)/количество (различный платежный_токен)/100, КОГДА цена ‹= 1000 И страна ‹› ' Израиль' ТОГДА (цена+50)/количество(Отдельный платеж_токен)/100 КОГДА цена › 1000 И страна = 'Израиль' ТОГДА (цена+0,05*цена+0,18*цена)/100 ИНАЧЕ (цена+0,05*цена)/количество (Различный платежный_токен)/100 END) как asp FROM.... WHERE.... Группировать по 1 - person shayms8; 09.02.2016