分析函数的基本概念和语法 -> http://blog.csdn.net/fw0124/article/details/7842039
下面这些函数计算某个值在一组有序数据中的累计分布(cumulative distribution)
1) cume_dist()
计算结果为相对位置/总行数。返回值(0,1]。
例如在一个5行的组中,返回的累计分布值为0.2,0.4,0.6,0.8,1.0;
注意对于重复行,计算时取重复行中的最后一行的位置。
a)作为聚合函数的用法
语法:cume_dist(expr) with group (order by exp)
cume_dist()用参数中的指定的数据构造一条假定的数据并插入到现存行中,
然后计算这条假定数据在所有行中的相对位置。
例如下面的查询中,emp中总共有14行数据,
假定的数据(deptno=20,sal=4000)会插入到第9行,
因此相对位置 9/(14+1)=0.6。
tony@ORA11GR2> select cume_dist(20,4000)
2 within group (order by deptno, sal) cume_dist
3 from emp;
CUME_DIST
----------
.6
b)作为分析函数的用法
语法:cume_dist() over([partition_clause] order_by_clause)
例如计算每个人在本部门按照薪水排列中的相对位置。
tony@ORA11GR2> select ename, sal, deptno,
2 cume_dist() over(partition by deptno order by sal) cume_dist
3 from emp;
ENAME SAL DEPTNO CUME_DIST
-------------------- ---------- ---------- ----------
MILLER 1300 10 .333333333
CLARK 2450 10 .666666667
KING 5002 10 1
SMITH 800 20 .2
ADAMS 1100 20 .4
JONES 2975 20 .6
SCOTT 3000 20 1
FORD 3000 20 1
JAMES 950 30 .166666667
MARTIN 1250 30 .5
WARD 1250 30 .5
TURNER 1500 30 .666666667
ALLEN 1600 30 .833333333
BLAKE 2850 30 1
已选择14行。
2) percent_rank()
和cume_dist的不同点在于计算分布结果的方法。
计算方法为 (相对位置-1)/(总行数-1),
因此第一行的结果为0。返回值[0,1]。
例如在一个5行的组中,返回的累计分布值为0,0.25,0.5,0.75,1.0;
注意对于重复行,计算时取重复行中的第一行的位置。
a)作为聚合函数的用法
语法:percent_rank(expr) with group (order by exp)
下面的例子中,类似cume_dist,假定数据(deptn