cume_dist vs percent_rank或之间的区别

时间:2014-05-11 06:35:38

标签: sql oracle plsql

在下面的查询中,我返回不同的结果,但无法弄清楚这两个函数是什么。

select firstname,gender,weight,height,
  cume_dist() over (order by height) cd,
  percent_rank() over (order by height) pr
from childstat order by height

FIRSTNAME                                          GENDER     WEIGHT     HEIGHT         CD         PR
-------------------------------------------------- ------ ---------- ---------- ---------- ----------
buddy                                              m             150         15 0.2857142857          0 
Albert                                             m             923         15 0.2857142857          0 
rosemary                                           f             123         35 0.4285714286 0.3333333333 
lauren                                             f             876         54 0.5714285714        0.5 
furkar                                             m             198         76 0.7142857143 0.6666666667 
tommy                                              m             167         78 0.8571428571 0.8333333333 
simon                                              m             256         87          1          1 

2 个答案:

答案 0 :(得分:4)

你在问这些功能是做什么的吗?

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions035.htm

CUME_DIST计算一组值中值的累积分布。

在您的示例中,这意味着~29%的高度小于或等于好友。 ~57%的高度小于或等于劳伦。等

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions109.htm

PERCENT_RANK类似于CUME_DIST(累积分布)函数。 PERCENT_RANK返回的值范围是0到1(包括0和1)。任何集合中的第一行的PERCENT_RANK为0.返回值为NUMBER。

答案 1 :(得分:1)

这两个值的计算方式不同-请查看有关这两个功能的手册:cume_distpercent_rank

  1. CUME_DIST()over_clause

返回一组值在一个值中的累积分布;也就是说,分区值的百分比小于或等于当前行中的值。这表示窗口分区的窗口顺序中当前行之前或对等的行数除以窗口分区的总行数。返回值范围为0到1。

  1. PERCENT_RANK()over_clause

返回小于当前行中值的分区值的百分比(最高值除外)。返回值的范围是0到1,并表示根据该公式的结果计算的行相对等级,其中rank是行等级,而rows是分区行的数量: (排名-1)/(行-1)

在您的示例中,对于第一行,cume_dist将返回2/7,因为在7行中,有2个值(15)小于或等于当前行值(15)。 percent_rank将返回0,因为(1-1)/(7-1)= 0。