【问题标题】:SQL. Unexpected result of calling PERCENTILE_CONT functionSQL。调用 PERCENTILE_CONT 函数的意外结果
【发布时间】:2016-10-06 03:35:15
【问题描述】:

实际上,我了解PERCENTILE_CONT 的工作原理,但是通过手动计算百分位数和调用函数,我得到了不同的结果。 这是数据集:

305.7884804
350
373.3728865
384.2094838
410.8603441
414.9842786
455.3545205
550

要计算 25%,我将 350373.3728865 相加,然后除以 2。结果是 361.68644325

要计算 50%,我将 384.2094838410.8603441 相加,然后除以 2。结果是 397.53491395

要计算 75%,我将 414.9842786455.3545205 相加,然后除以 2。结果是 435.16939955

但是,当我运行这个 sql 时:

select 
percentile_cont(0.25) within group(order by YEAR_2_FTE ASC), 
percentile_cont(0.5) within group(order by YEAR_2_FTE ASC), 
percentile_cont(0.75) within group(order by YEAR_2_FTE ASC) from sr_database 
where firm_id=999;

我得到这样的结果:

25%: 367.529664875
50%: 397.53491395
75%: 425.076839075

我错过了什么?

【问题讨论】:

    标签: sql oracle statistics


    【解决方案1】:

    您正确地取了第 4 和第 5 值之间的中间点来计算第 50 个百分位数。但是在第 25 个百分位数(第 75 个百分位数也是如此)中取第 2 个和第 3 个之间的中间点是不正确的。最好通过插图来了解这一点:

    这显示了 8 个点和在它们之间绘制的 4 条线,以形成 4 个大小相同的线段。第 25 个和第 75 个百分位标记分别接近第 3 个和第 6 个值。

    Oracle documentation 描述了这些是如何计算的:

    PERCENTILE_CONT 的结果是通过线性插值计算的 排序后的值之间。使用百分位值 (P) 和 聚合组中的行数(N),我们计算行 排序后我们感兴趣的数字 排序规范。此行号 (RN) 是根据以下公式计算的 公式 RN = (1+ (P*(N-1)). 聚合的最终结果 函数是通过值之间的线性插值计算的 行号 CRN = CEILING(RN) 和 FRN = FLOOR(RN) 处的行。

    在您的示例中,对于第 25 个百分位 P = 0.25N = 8 所以:

    RN = (1+ 0.25*(8-1))
       = 2.75
    

    所以CRN = 3FRN = 2

    文档接着说:

    最终结果将是:

    如果 (CRN = FRN = RN) 那么结果是

    (value of expression from row at RN)
    

    否则结果是

    (CRN - RN) * (value of expression for row at FRN) +
    
    (RN - FRN) * (value of expression for row at CRN)
    

    插入上面的值,“否则...”部分适用于计算,即:

    Result = (3 - 2.75) * 350 + (2.75 - 2) * 373.3728856
           = 367.5296642
    

    对于第 75 个百分位数也是如此:

     RN = (1+ 0.75*(8-1))
        = 6.25
    CRN = 7
    FRN = 6
    Result = (7 - 6.25) * 414.9842786 + (6.25 - 6) * 455.3545205
           = 425.076839075
    

    【讨论】:

    • 感谢您的解释。据我了解,没有可以按预期工作的内置功能? PERCENTILE_DISC 适用于离散数据。
    • 认为使用中点值作为第 25 和第 75 个百分位数的意图是有缺陷的。为了帮助理解这一点,请查看您是否可以在计算时想出第 n 个百分位数的公式,其中 n 可以是 0 到 100 之间的任何数字。 ..
    • 更新:已在答案中添加了插图,希望能更清楚。
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多