как я могу использовать функцию SUM() внутри функции SUM в Presto SQL?

#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, если речь идет о манипулировании самой метрикой и фильтрации, если речь идет о входных записях, подлежащих обработке. Таким образом, вы остаетесь открытыми для добавления другой обработки сверху с минимальными изменениями позже.