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)
我想知道是否有任何方法可以修改查询,以便不使用子查询?
从 Oracle 参考:
分析函数是在查询中执行的最后一组操作,除了最后的 ORDER BY 子句。所有连接和所有 WHERE、GROUP BY 和 HAVING 子句都在处理分析函数之前完成。因此,解析函数只能出现在选择列表或 ORDER BY 子句中。
聚合函数通常与 SELECT 语句中的 GROUP BY 子句一起使用,其中 Oracle 数据库将查询的表或视图的行划分为组。在包含 GROUP BY 子句的查询中,选择列表的元素可以是聚合函数、GROUP BY 表达式、常量或涉及其中之一的表达式。Oracle 将聚合函数应用于每组行并为每组返回单个结果行。
如果省略 GROUP BY 子句,则 Oracle 将选择列表中的聚合函数应用于查询表或视图中的所有行。
所以你不能把分析函数放在聚合函数中,因为聚合函数是在分析之前执行的(但你可以在分析函数中使用聚合函数)。
PS顺便说一下,子查询有什么问题?