新博客http://www.cnblogs.com/zhjh256 欢迎访问
分类: Oracle
2008-01-06 21:43:39
分析函数的关键特征是它们允许结果集的单行可以包括计算的多行交叉而不需要在整个结果集上处理GROUP BY。其允许多行和单行数据在一个select语句中而不需要部署子查询。
分析函数的语法
FUNCTION() OVER (
PARTITION BY定义函数将处理的组,如果partition by被忽略,那么整个select返回的数据集将作为一个活动分区。
ORDER BY排序分区内的数据,可以声明ASC/DESC,以及NULLS FIRST和NULLS LAST标识null的处理。
WINDOWING CLAUSE不能在每个分区函数上使用,如果可用,必须和ORDER BY一起使用。窗口子句声明了将在函数中计算的当前行周围的行集。窗口可以定义为ROWS或RANGE,ROWS相对于活动分区中的行数,而RANGE则查看包含在这些行中的值。默认为ROWS UNBOUNDED PROCEDING事实上包含了所有行。
分析函数的列表
分析函数通常分为三类,数组,聚集,其他。
最常用的函数包括:
函数 |
类型 |
Partition by |
Order By |
Window |
DENSE_RANK |
数组 |
可选 |
必须 |
-- |
RANK |
数组 |
可选 |
必须 |
-- |
ROW_NUMBER |
数组 |
可选 |
必须 |
-- |
NTILE |
数组 |
可选 |
必须 |
-- |
AVG |
聚集 |
可选 |
可选 |
可选 |
COUNT |
聚集 |
可选 |
可选 |
可选 |
SUM |
聚集 |
可选 |
可选 |
可选 |
RATIO_TO_REPORT |
聚集 |
可选 |
-- |
-- |
FIRST_VALUE |
其他 |
可选 |
可选 |
可选 |
LAST_VALUE |
其他 |
可选 |
可选 |
可选 |
LAG |
其他 |
可选 |
必须 |
-- |
LEAD |
其他 |
可选 |
必须 |
-- |
MAX |
其他 |
可选 |
可选 |
可选 |
MIN |
其他 |
可选 |
可选 |
可选 |
前三个函数基本相同,只是处理重复数值上有所不同:
Value |
ROW_NUMBER |
DENSE_RANK |
RANK |
1000 |
1 |
1 |
1 |
2000 |
2 |
2 |
2 |
2000 |
3 |
2 |
2 |
3000 |
4 |
3 |
4 |
ROW_NUMBER返回行在活动窗口中的偏移量;
DENSE_RANK返回行值在活动窗口中的大小等级;
RANK返回行值在活动窗口中的大小等级,但是增量依赖于在行中的位置;
通常这些函数用来计算top-n并将之嵌入结果集的列中。
需要注意的是,分析函数在输出排序结果集之前进行。因此不能作为where和having的条件,并且只能在SQL中使用,而不能在PL/SQL中使用。在PL/SQL中只能作为动态SQL使用,或封装在视图中。
并且分析函数是非确定性函数。