【发布时间】:2018-12-14 12:34:40
【问题描述】:
我正在尝试编写一个查询,该查询会产生给定值的运行总和。但是,当应用 SUM 作为分析函数时,我得到的结果是一个窗口内的平均值。
示例: 考虑以下查询:
with tbl as
(
select 'steve' "NAME", 2000 val from dual UNION ALL
select 'john' "NAME", 4000 val from dual UNION ALL
select 'peter' "NAME", 270 val from dual UNION ALL
select 'peter' "NAME", 270 val from dual UNION ALL
select 'peter' "NAME", 90 val from dual UNION ALL
select 'peter' "NAME", 450 val from dual UNION ALL
select 'hary' "NAME", 2772 val from dual UNION ALL
select 'may' "NAME", 2227.5 val from dual UNION ALL
select 'tom' "NAME", 500 val from dual UNION ALL
select 'sia' "NAME", 20000 val from dual
)
select name, val,
sum(val) over (order by name) running_sum
from tbl;
结果:
我真正想要的是
我使用 ROWNUM 得到的:
with tbl as
(
select 'steve' "NAME", 2000 val from dual UNION ALL
select 'john' "NAME", 4000 val from dual UNION ALL
select 'peter' "NAME", 270 val from dual UNION ALL
select 'peter' "NAME", 270 val from dual UNION ALL
select 'peter' "NAME", 90 val from dual UNION ALL
select 'peter' "NAME", 450 val from dual UNION ALL
select 'hary' "NAME", 2772 val from dual UNION ALL
select 'may' "NAME", 2227.5 val from dual UNION ALL
select 'tom' "NAME", 500 val from dual UNION ALL
select 'sia' "NAME", 20000 val from dual
)
select name, val,
sum(val) over (order by rownum) running_sum
from tbl;
第一个结果中显示的 peter 的 running_sum 实际上是 peter 的总 running_sum 的平均值。分析函数正在为彼得考虑一个窗口,因为我在窗口子句中包含了“NAME”。但是为什么查询结果是窗口的平均值而不是运行 sum?
【问题讨论】:
-
你为什么认为这些是平均值,以及什么?它们是总和……?按名称排序,或者至少只是按名称排序, in 并没有什么意义——因为 peter 的所有三行排序相同。是否还有其他一些您没有显示的字段(例如时间戳)决定了它们的评估顺序?
-
我只能猜测有一个隐含的 GROUP BY 因为您使用的是聚合函数,首先按名称,在第二种情况下按 rownum
标签: sql oracle analytic-functions