Welcome 微信登录

首页 / 数据库 / MySQL / Oracle分析函数总结- 数值分布 - cume_dist,percent_rank,ntile,percentile_disc,percentile_cont,ratio_to_report

Oracle分析函数的基本概念和语法 ->  http://www.linuxidc.com/Linux/2012-08/67670.htm

下面这些函数计算某个值在一组有序数据中的累计分布(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。
  1. www.linuxidc.com @ORA11GR2> select cume_dist(20,4000)  
  2.   2      within group (order by deptno, sal) cume_dist  
  3.   3  from emp;  
  4.   
  5.  CUME_DIST  
  6. ----------   
  7.         .6  
b)作为分析函数的用法
语法:cume_dist() over([partition_clause] order_by_clause)
例如计算每个人在本部门按照薪水排列中的相对位置。
  1. www.linuxidc.com @ORA11GR2> select ename, sal, deptno,  
  2.   2      cume_dist() over(partition by deptno order by sal) cume_dist  
  3.   3   from emp;  
  4.   
  5. ENAME                       SAL     DEPTNO  CUME_DIST  
  6. -------------------- ---------- ---------- ----------   
  7. MILLER                     1300         10 .333333333  
  8. CLARK                      2450         10 .666666667  
  9. KING                       5002         10          1  
  10. SMITH                       800         20         .2  
  11. ADAMS                      1100         20         .4  
  12. JONES                      2975         20         .6  
  13. SCOTT                      3000         20          1  
  14. FORD                       3000         20          1  
  15. JAMES                       950         30 .166666667  
  16. MARTIN                     1250         30         .5  
  17. WARD                       1250         30         .5  
  18. TURNER                     1500         30 .666666667  
  19. ALLEN                      1600         30 .833333333  
  20. BLAKE                      2850         30          1  
  21.   
  22. 已选择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,假定数据(deptno=20,sal=4000)会插入到第9行,
计算相对位置 (9-1)/((14+1)-1)=0.57
  1. www.linuxidc.com @ORA11GR2> select percent_rank(20,4000)  
  2.   2      within group (order by deptno, sal) percent_rank  
  3.   3  from emp;  
  4.   
  5. PERCENT_RANK  
  6. ------------   
  7.   .571428571  
b)作为分析函数的用法
语法: percent_rank() over([partition_clause] order_by_clause)
例如计算每个人在本部门按照薪水排列中的相对位置。
  1. www.linuxidc.com @ORA11GR2> select ename, sal, deptno,  
  2.   2      percent_rank() over(partition by deptno order by sal) percent_rank  
  3.   3  from emp;  
  4.   
  5. ENAME                       SAL     DEPTNO PERCENT_RANK  
  6. -------------------- ---------- ---------- ------------   
  7. MILLER                     1300         10            0  
  8. CLARK                      2450         10           .5  
  9. KING                       5002         10            1  
  10. SMITH                       800         20            0  
  11. ADAMS                      1100         20          .25  
  12. JONES                      2975         20           .5  
  13. SCOTT                      3000         20          .75  
  14. FORD                       3000         20          .75  
  15. JAMES                       950         30            0  
  16. MARTIN                     1250         30           .2  
  17. WARD                       1250         30           .2  
  18. TURNER                     1500         30           .6  
  19. ALLEN                      1600         30           .8  
  20. BLAKE                      2850         30            1  
  21.   
  22. 已选择14行。  
3) percentile_disc()
返回一个与输入的分布百分比值相对应的数据值,
分布百分比的计算方法同函数CUME_DIST(),
如果没有正好对应的数据值,就取大于该分布值的下一个值。

a)作为聚合函数的用法
语法: percentile_disc(expr) with group (order by expr)
例如,查询各部门中薪水分布处于40%位置的人的薪水。
  1. www.linuxidc.com @ORA11GR2> select deptno,  
  2.   2       percentile_disc(0.4) within group (order by sal) percentile_disc  
  3.   3  from emp group by deptno;  
  4.   
  5.     DEPTNO PERCENTILE_DISC  
  6. ---------- ---------------   
  7.         10            2450  
  8.         20            1100  
  9.         30            1250  
2)作为分析函数的用法
语法:percentile_disc(expr) with group (order by expr) over([partition_clause])
例如,查询各部门中薪水分布处于40%位置的人的薪水。注意和cume_dist()的输出结果作对照。
  1. www.linuxidc.com @ORA11GR2> select ename, sal, deptno,  
  2.   2  cume_dist() over(partition by deptno order by sal) cume_dist,  
  3.   3  percentile_disc(0.4) within group (order by sal)  
  4.   4      over(partition by deptno) percentile_disc  
  5.   5  from emp;  
  6.   
  7. ENAME                       SAL     DEPTNO  CUME_DIST PERCENTILE_DISC  
  8. -------------------- ---------- ---------- ---------- ---------------   
  9. MILLER                     1300         10 .333333333            2450  
  10. CLARK                      2450         10 .666666667            2450  
  11. KING                       5002         10          1            2450  
  12. SMITH                       800         20         .2            1100  
  13. ADAMS                      1100         20         .4            1100  
  14. JONES                      2975         20         .6            1100  
  15. SCOTT                      3000         20          1            1100  
  16. FORD                       3000         20          1            1100  
  17. JAMES                       950         30 .166666667            1250  
  18. MARTIN                     1250         30         .5            1250  
  19. WARD                       1250         30         .5            1250  
  20. TURNER                     1500         30 .666666667            1250  
  21. ALLEN                      1600         30 .833333333            1250  
  22. BLAKE                      2850         30          1            1250  
  23.   
  24. 已选择14行。  
  • 1
  • 2
  • 下一页
Oracle分析函数总结 - 排序 - rank,dense_rank,row_number,first,first_value,last,last_value,lag,leadOracle实现分页相关资讯      Oracle函数  Oracle分析函数 
  • Oracle字符串函数总结  (06月20日)
  • Oracle lag()与lead() 函数  (12/01/2015 20:41:24)
  • Oracle ascii函数  (07/26/2015 08:46:01)
  • Oracle使用简单函数  (06月09日)
  • REGEXP_SUBSTR函数的整理  (08/20/2015 20:41:01)
  • Oracle dump函数  (07/26/2015 08:40:01)
本文评论 查看全部评论 (0)
表情: 姓名: 字数
版权所有©石家庄振强科技有限公司2024 冀ICP备08103738号-5 网站地图