* 6000 = 5760
SELECT last_name, salary, department_id, PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary) OVER (PARTITION BY department_id) "Percentile_Cont", PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary) "Percent_Rank" FROM employees WHERE department_id IN (30, 60);
LAST_NAME SALARY DEPARTMENT_ID Percentile_Cont Percent_Rank ------------------------- ---------- ------------- --------------- ------------ Colmenares 2500 30 3000 0 Himuro 2600 30 3000 0.2 Tobias 2800 30 3000 0.4 Baida 2900 30 3000 0.6 Khoo 3100 30 3000 0.8 Raphaely 11000 30 3000 1 Lorentz 4200 60 5760 0 Austin 4800 60 5760 0.25 Pataballa 4800 60 5760 0.25 Ernst 6000 60 5760 0.75 Hunold 9000 60 5760 1
PERCENTILE_DISC 功能描述:返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函数CUME_DIST,如果没有正好对应的数据值,就取大于该分布值的下一个值。 注意:本函数与PERCENTILE_CONT的区别在找不到对应的分布值时返回的替代值的计算方法不同
SAMPLE:下例中0.7的分布值在部门30中没有对应的Cume_Dist值,所以就取下一个分布值0.83333333所对应的SALARY来替代
SELECT last_name, salary, department_id, PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary ) OVER (PARTITION BY department_id) "Percentile_Disc", CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) "Cume_Dist" FROM employees WHERE department_id in (30, 60);
LAST_NAME SALARY DEPARTMENT_ID Percentile_Disc Cume_Dist ------------------------- ---------- ------------- --------------- ---------- Colmenares 2500 30 3100 .166666667 Himuro 2600 30 3100 .333333333 Tobias 2800 30 3100 .5 Baida 2900 30 3100 .666666667 Khoo 3100 30 3100 .833333333 Raphaely 11000 30 3100 1 Lorentz 4200 60 6000 .2 Austin 4800 60 6000 .6 Pataballa 4800 60 6000 .6 Ernst 6000 60 6000 .8 Hunold 9000 60 6000 1
RANK 功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。然而,如果两行的确得到同样的排序,则序数将随后跳跃。若两行序数为1,则没有序数2,序列将给组中的下一行分配值3,DENSE_RANK则没有任何跳跃。 SAMPLE:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与DENSE_RANK函数的区别)
SELECT d.department_id , e.last_name, e.salary, RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank FROM employees e, departments d WHERE e.department_id = d.department_id AND d.department_id IN (''''60'''', ''''90'''');
DEPARTMENT_ID LAST_NAME SALARY DRANK ------------- ------------------------- ---------- ---------- 60 Lorentz 4200 1 60 Austin 4800 2 60 Pataballa 4800 2 60 Ernst 6000 4 60 Hunold 9000 5 90 Kochhar 17000 1 90 De Haan &上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页 |