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

时间:2014-11-13 04:42:16

标签: 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

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

select variance(lead( value,1) OVER (order by date) - value)
 from DATE_VALUE

我收到了一个错误:

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

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

select variance(difvalue) from (
  select lead( value,1) OVER (order by rundate) - value  as difvalue
  from DATE_VALUE 
);

我想知道是否有办法修改查询,以至于没有使用子查询?

1 个答案:

答案 0 :(得分:3)

来自Oracle参考:

  

分析函数是查询中执行的最后一组操作   除了最终的ORDER BY子句。所有加入和所有WHERE,GROUP   BY和HAVING子句在分析函数之前完成   处理。因此,分析函数只能出现在select中   list或ORDER BY子句。

     

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

     

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

因此,您无法将分析函数放在聚合函数中,因为聚合函数在分析之前执行(但您可以在分析函数中使用聚合函数)。

P.S。顺便问一下,子查询有什么问题?