如何在 Presto SQL 中的 SUM 函数内部使用函数 SUM()?

how can I use function SUM() inside of SUM function in Presto SQL?

我正在尝试通过以下逻辑获得两个数字的 SUM: x = y + j 基于这个逻辑,我使用 SUM() 函数编写了 presto 查询以获得 x 和 y 的 SUM,但是我得到了 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"((CASE WHEN (source = 'y') THEN count ELSE 0 END)), "sum"((CASE WHEN (source = 'x') THEN num_tasks ELSE 0 END))]

我不确定我是否理解您的意图,但我认为以下更改可能会有所帮助:

  • CASE WHEN 中使用 IN 语句:source in ('x', 'y')
  • 使用IF代替CASEif(source in ('x', 'y'), num_tasks, 0)
  • 我相信你只需要一个 SUM 电话。

综合起来:

SELECT SUM(if(source in ('x', 'y'), num_tasks, 0))

或者,您可以使用 SUMFILTER 语法:

SELECT SUM(num_tasks) filter (where source in ('x', 'y'))

作为对@Dain Sundstrom 回答的补充:使用条件求和

SELECT SUM(if(source in ('x', 'y'), num_tasks, 0))

并过滤

SELECT SUM(num_tasks) filter (where source in ('x', 'y'))

甚至可以合并合并。我为什么要用这个?试想一下,您在产品中遇到问题,并且一台机器确实以错误的因子(例如 1000x)写入了数据。任何大于 1000 的价格,但仅适用于来源 'x' 或 'y'.

这可以通过

解决
SELECT sum(if(price >= 1000000, price/1000, price)),0) 
filter (where source in ('x', 'y')) as revenue

因此,如果它是关于操作指标本身,我会使用条件 IF 语句;如果它是关于要处理的输入记录,我会使用条件 IF 语句。通过这种方式,您可以保持开放状态,以便稍后在最上面添加其他处理,并进行最少的更改。