如何在 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
代替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 语句;如果它是关于要处理的输入记录,我会使用条件 IF 语句。通过这种方式,您可以保持开放状态,以便稍后在最上面添加其他处理,并进行最少的更改。
我正在尝试通过以下逻辑获得两个数字的 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
代替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 语句;如果它是关于要处理的输入记录,我会使用条件 IF 语句。通过这种方式,您可以保持开放状态,以便稍后在最上面添加其他处理,并进行最少的更改。