Oracle - 在聚合函数中使用分析函数

Way*_*ung 3 sql oracle aggregate-functions analytic-functions

我有一个像这样的表 DATE_VALUE:

  Date        Value

  ----        -----

01/01/2012    1.5 

02/01/2012    1.7 

03/01/2012    1.3

04/01/2012    2.1

05/01/2012    3.4
Run Code Online (Sandbox Code Playgroud)

我想计算两个连续日期之间的价值差异之间的差异。但是这个简单的查询不起作用:

select variance(lead( value,1) OVER (order by date) - value)
 from DATE_VALUE
Run Code Online (Sandbox Code Playgroud)

我有一个错误:

ORA-30483:此处不允许使用窗口函数 30483。00000 - “此处不允许使用窗口函数” *原因:仅在查询的 SELECT 列表中允许使用窗口函数。并且,窗口函数不能作为另一个窗口或组函数的参数。

如果我将方差函数移出查询,则查询工作正常:

select variance(difvalue) from (
  select lead( value,1) OVER (order by rundate) - value  as difvalue
  from DATE_VALUE 
);
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以修改查询,以便不使用子查询?

Mul*_*ync 5

从 Oracle 参考:

分析函数是在查询中执行的最后一组操作,除了最后的 ORDER BY 子句。所有连接和所有 WHERE、GROUP BY 和 HAVING 子句都在处理分析函数之前完成。因此,解析函数只能出现在选择列表或 ORDER BY 子句中。

聚合函数通常与 SELECT 语句中的 GROUP BY 子句一起使用,其中 Oracle 数据库将查询的表或视图的行划分为组。在包含 GROUP BY 子句的查询中,选择列表的元素可以是聚合函数、GROUP BY 表达式、常量或涉及其中之一的表达式。Oracle 将聚合函数应用于每组行并为每组返回单个结果行。

如果省略 GROUP BY 子句,则 Oracle 将选择列表中的聚合函数应用于查询表或视图中的所有行。

所以你不能把分析函数放在聚合函数中,因为聚合函数是在分析之前执行的(但你可以在分析函数中使用聚合函数)。

PS顺便说一下,子查询有什么问题?