【问题标题】:percentile_disc vs percentile_contpercentile_disc 与 percentile_cont
【发布时间】:2014-06-28 10:28:30
【问题描述】:

PERCENTILE_DISCPERCENTILE_CONT有什么区别,

我有一张表 ### select * from childstat

FIRSTNAME                                          GENDER BIRTHDATE     HEIGHT     WEIGHT
-------------------------------------------------- ------ --------- ---------- ----------
lauren                                             f      10-JUN-00         54        876 
rosemary                                           f      08-MAY-00         35        123 
Albert                                             m      02-AUG-00         15        923 
buddy                                              m      02-OCT-00         15        150 
furkar                                             m      05-JAN-00         76        198 
simon                                              m      03-JAN-00         87        256 
tommy                                              m      11-DEC-00         78        167 

我正在尝试区分这些百分位数

select firstname,height,
       percentile_cont(.50) within group (order by height) over() as pctcont_50_ht,
       percentile_cont(.72) within group (order by height) over() as pctcont_72_ht,
       percentile_disc(.50) within group (order by height) over () as pctdisc_50_ht,
       percentile_disc(.72) within group (order by height) over () as pctdisc_72_ht
from childstat order by height


FIRSTNAME                                              HEIGHT PCTCONT_50_HT PCTCONT_72_HT PCTDISC_50_HT PCTDISC_72_HT
-------------------------------------------------- ---------- ------------- ------------- ------------- -------------
buddy                                                      15            54         76.64            54            78 
Albert                                                     15            54         76.64            54            78 
rosemary                                                   35            54         76.64            54            78 
lauren                                                     54            54         76.64            54            78 
furkar                                                     76            54         76.64            54            78 
tommy                                                      78            54         76.64            54            78 
simon                                                      87            54         76.64            54            78 

但是还是不明白这两个是怎么用的,这两个功能有什么用..

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    PERCENTILE_DISC 在您的集合/窗口中返回一个值,而PERCENTILE_CONT 将进行插值;

    在您的查询中,当您使用.72 时,PERCENTILE_CONT 在 76 和 78 之间进行插值,因为 72% 两者都不是; PERCENTILE_DISC 选择 76(最低的)

    【讨论】:

    • 我认为这个想法是 PERCENTILE_DISC() 应该用于 离散 范围,而 PERCENTILE_CONT() 应该用于 连续 范围.
    • 对于在 sqlfiddle (sqlfiddle.com/#!17/065fd/5) 中检查的 percentile_disc,Postgres 返回 78 而不是 76 WITH vals (k) AS (VALUES (54), (35), (15), (15), (76 ), (87), (78)) SELECT * INTO table percentile_src FROM vals;选择组内的 percentile_disc(.72) (按 k 排序) as perc from percentile_src;
    【解决方案2】:

    我发现这个解释很有帮助 http://mfzahirdba.blogspot.com/2012/09/difference-between-percentilecont-and.html

        ITEM REGION             WK FORECASTQTY
        ---- ---------- ---------- -----------
        TEST E                   3         137
        TEST E                   2         190
        TEST E                   1         232
        TEST E                   4         400
    
    
    
    SELECT
       t.* ,
       PERCENTILE_CONT(0.5)
       WITHIN GROUP ( ORDER BY forecastqty)
       OVER (PARTITION BY ITEM , region ) AS PERCENTILE_CONT ,
       MEDIAN(forecastqty)
       OVER (PARTITION BY ITEM , region ) AS MEDIAN ,
       PERCENTILE_DISC(0.5)
       WITHIN GROUP ( ORDER BY forecastqty)
       OVER (PARTITION BY ITEM , region ) AS PERCENTILE_DISC
       FROM
       t ;
    
    
    
        ITEM REGION             WK FORECASTQTY PERCENTILE_CONT     MEDIAN PERCENTILE_DISC
        ---- ---------- ---------- ----------- --------------- ---------- ---------------
        TEST E                   3         137             211        211             190
        TEST E                   2         190             211        211             190
        TEST E                   1         232             211        211             190
        TEST E                   4         400             211        211             190
    

    【讨论】:

    • 这篇文章解释得很好。感谢分享好资源。
    猜你喜欢
    • 2019-02-18
    • 2011-10-12
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多