一尘不染

percentile_cont和percentile_disc都没有在PostgreSQL 9.6.3中计算所需的第75个百分位数

sql

使用百分位函数,但没有得到所需的输出。我会说“不正确”,但是功能可能按预期工作,而我只是不正确地理解它们。

这些是我正在使用的数字:

n = 32

160000
202800
240000
250000
265000
280000
285000
300000
300000
300000
300000
300000
309000
325000
350000
358625
364999.92
393750
400000
420000
425000
450000
450000
463500
475000
475000
505808
525000
550000
567300
665000
900000

我的理解percentile_cont是,如果计数是偶数,它将聚合两个数字,将两个数字相加然后相除。我的理解percentile_disc是,如果计数为偶数,它将只选择最低的数字。

这是我对使用第50(中位数)示例计算百分位数的理解:

如果数字(n)为奇数,则选择中间的数字;否则,选择0。如果数字是偶数,则取中间两个数字的平均值。因此,在这种情况下,有32个数字,因此中位数=
(358625 + 364999.92) / 2 = 361812.46percentile_cont返回正确的值,因为它将两个值取平均值;percentile_disc返回错误的值,因为它选择了两者中的最小值。

关于其他百分位,例如第十位,我的理解是将百分位乘以数字(n)来获得索引:.10 * 32 = 3.2 index在这种情况下。然后应该将您舍入到最接近的整数,这就是您的百分位数值。如果索引是整数,则将索引中的数字与紧随其后的数字进行平均。

在那种情况下,percentile_cont是错误的,因为它返回的251500甚至是我无法到达的数字。我能得到的最接近的平均值24000, 250000, 265000251666.67percentile_disc返回的正确结果250000

但是真正的踢球者是 第75个。它应该469250根据我的计算返回。index = (32*.75) = 24,该索引应为(463500 + 475000) = 469250percentile_disc回报463500;
percentile_cont返回466375,这又是我一生无法得出的数字。

这是我的查询:

SELECT 
    itemcode, 
    COUNT(itemcode) AS n, 
    PERCENTILE_DIST(0.10) WITHIN GROUP (ORDER BY price) AS 10th,
    PERCENTILE_DIST(0.25) WITHIN GROUP (ORDER BY price) AS 25th,
    PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY price) AS median,
    AVG(price) AS mean,
    PERCENTILE_DIST(0.65) WITHIN GROUP (ORDER BY price) AS 65th,
    PERCENTILE_DIST(0.75) WITHIN GROUP (ORDER BY price) AS 75th,
    PERCENTILE_DIST(0.90) WITHIN GROUP (ORDER BY price) AS 90th
FROM items
WHERE itemcode = 26 AND removed IS NULL
GROUP BY itemcode;

注意:在任何情况下removed都不是NULL

我需要做些什么才能使其正常且一致地工作?我需要编写一个函数,检查n前先确定哪些percentile_discpercentile_cont基于它是否是奇数还是偶数?

SQL小提琴:http
://sqlfiddle.com/#!17/aa09c/9


阅读 443

收藏
2021-05-23

共1个答案

一尘不染

将此问题发布到Reddit并获得了一些帮助。

显然,percentile_cont除了Excel中的percentilepercentile.inc函数外,该函数还使用Wikipedia中解释的线性插值的C
= 1变体进行计算:

https://zh.wikipedia.org/wiki/Percentile#Second_variant.2C_.7F.27.22.60UNIQ--
postMath-00000043-QINU.60.22.27.7F

显然,我一直在使用的是平均经验分布。

因此,PostgreSQL的本机功能不能很好地工作,并且需要创建一个自定义功能,我将在完成后发布该功能。(我怀疑它会使用ntile9.4之前的旧方法,但仍会研究它)。

但是无论如何,这就是为什么它关闭了。

2021-05-23