cume_dist vs percent_rank 或之间的差异

Posted

技术标签:

【中文标题】cume_dist vs percent_rank 或之间的差异【英文标题】:cume_dist vs percent_rank or difference between 【发布时间】:2014-05-11 06:35:38 【问题描述】:

在以下查询中,我返回不同的结果,但不知道这两个函数是什么。

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 

【问题讨论】:

【参考方案1】:

这两个值的计算方式不同 - 请查看这两个函数的手册:cume_dist 和 percent_rank

    CUME_DIST() over_clause

返回一个值在一组值中的累积分布;即分区值小于或等于当前行值的百分比。这表示在窗口分区的窗口排序中在当前行之前或与当前行对等的行数除以窗口分区中的总行数。返回值范围从 0 到 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。

【讨论】:

【参考方案2】:

你是在问这些函数是做什么的?

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

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

在您的示例中,这意味着 ~29% 的身高小于或等于好友。约 57% 的身高低于或等于 lauren。等等。

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

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

【讨论】:

以上是关于cume_dist vs percent_rank 或之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包排序及序号函数实战(row_numberntilemin_rankdense_rankpercent_rankcume_dist)

MySQL窗口_分布、前后、头尾函数

开窗函数_3

开窗函数_3

MySql窗口函数

postgresql里有没有像oracle中的那类分析函数