#presto
#presto
Вопрос:
Я пытаюсь получить СУММУ двух чисел, следуя следующей логике: x = y j основываясь на этой логике, я написал запрос presto, используя функцию SUM(), чтобы получить СУММУ x и y, но я получил синтаксическую ошибку Presto
SELECT
SUM(sum(CASE
WHEN source = 'x' THEN num_tasks
ELSE 0
END) sum(CASE WHEN source = 'y' THEN num_tasks ELSE 0 END)) as total
Уведомление об ошибке
Сбой запроса Presto. Ошибка: SYNTAX_ERROR: не удается вложить агрегации в агрегацию ‘sum’: [«sum»((СЛУЧАЙ, КОГДА (source = ‘y’) ЗАТЕМ count ELSE 0 END)), «sum»((СЛУЧАЙ, КОГДА (source = ‘x’) ЗАТЕМ num_tasks ELSE 0 END))]
Комментарии:
1. Похоже, вы не можете использовать
Sum
Sum
так, как хотите, в соответствии с документацией SQL. Вместо этого попробуйте что-то вродеSUM(SELECT FIELD_1, FIELD_2 from TABLE_1, TABLE_2)
. Затем вы можете извлечь столбцы, которые хотите суммировать все сразу
Ответ №1:
Я не уверен, что понимаю, что вы пытаетесь сделать, но я думаю, что следующие изменения могут помочь:
- Используйте
IN
оператор вCASE WHEN
:source in ('x', 'y')
- Используйте
IF
вместоCASE
:if(source in ('x', 'y'), num_tasks, 0)
- Я считаю, что вам нужен только один
SUM
вызов.
Собрать все это вместе:
SELECT SUM(if(source in ('x', 'y'), num_tasks, 0))
В качестве альтернативы вы можете использовать синтаксис SUM
with FILTER
:
SELECT SUM(num_tasks) filter (where source in ('x', 'y'))
Ответ №2:
Просто в качестве дополнения к ответу @Dain Sundstrom: использование условного суммирования
SELECT SUM(if(source in ('x', 'y'), num_tasks, 0))
и фильтрация, подобная
SELECT SUM(num_tasks) filter (where source in ('x', 'y'))
можно даже комбинировать. Почему я должен это использовать? Просто представьте, что у вас возникла проблема в prod, и одна машина записала данные с неправильным коэффициентом (например, 1000x). Любая цена больше 1000, но только для источника ‘x’ или ‘y’.
Это можно исправить с помощью
SELECT sum(if(price >= 1000000, price/1000, price)),0)
filter (where source in ('x', 'y')) as revenue
Поэтому я бы использовал условный оператор IF, если речь идет о манипулировании самой метрикой и фильтрации, если речь идет о входных записях, подлежащих обработке. Таким образом, вы остаетесь открытыми для добавления другой обработки сверху с минимальными изменениями позже.