我有一个像这样的表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
);
我想知道是否有办法修改查询,以至于没有使用子查询?
答案 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。顺便问一下,子查询有什么问题?