我试图通过以下逻辑获取两个数字的总和:x = y + j基于这个逻辑,我使用 SUM(( 函数编写了 presto 查询,以获得 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"((CASE WHEN (source = 'y'( THEN COUNT ELSE 0 END((, "sum"((CASE WHEN (source = 'x'( THEN num_tasks ELSE 0 END((]]<</p>
不确定我是否理解您要做什么,但我认为以下更改可能会有所帮助:
- 在
CASE WHEN
中使用IN
语句: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
与FILTER
语法一起使用:
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 语句。通过这种方式,您可以保持开放状态,可以在以后添加其他处理,并进行最少的更改。