使用百分位函数,但没有得到所需的输出。我会说“不正确”,但是功能可能按预期工作,而我只是不正确地理解它们。
这些是我正在使用的数字:
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是,如果计数为偶数,它将只选择最低的数字。
percentile_cont
percentile_disc
这是我对使用第50(中位数)示例计算百分位数的理解:
如果数字(n)为奇数,则选择中间的数字;否则,选择0。如果数字是偶数,则取中间两个数字的平均值。因此,在这种情况下,有32个数字,因此中位数= (358625 + 364999.92) / 2 = 361812.46。percentile_cont返回正确的值,因为它将两个值取平均值;percentile_disc返回错误的值,因为它选择了两者中的最小值。
(358625 + 364999.92) / 2 = 361812.46
关于其他百分位,例如第十位,我的理解是将百分位乘以数字(n)来获得索引:.10 * 32 = 3.2 index在这种情况下。然后应该将您舍入到最接近的整数,这就是您的百分位数值。如果索引是整数,则将索引中的数字与紧随其后的数字进行平均。
.10 * 32 = 3.2 index
在那种情况下,percentile_cont是错误的,因为它返回的251500甚至是我无法到达的数字。我能得到的最接近的平均值24000, 250000, 265000是251666.67。percentile_disc返回的正确结果250000。
251500
24000, 250000, 265000
251666.67
250000
但是真正的踢球者是 第75个。它应该469250根据我的计算返回。index = (32*.75) = 24,该索引应为(463500 + 475000) = 469250。percentile_disc回报463500; percentile_cont返回466375,这又是我一生无法得出的数字。
469250
index = (32*.75) = 24
(463500 + 475000) = 469250
463500
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。
removed
NULL
我需要做些什么才能使其正常且一致地工作?我需要编写一个函数,检查n前先确定哪些percentile_disc或percentile_cont基于它是否是奇数还是偶数?
n
SQL小提琴:http ://sqlfiddle.com/#!17/aa09c/9
将此问题发布到Reddit并获得了一些帮助。
显然,percentile_cont除了Excel中的percentile和percentile.inc函数外,该函数还使用Wikipedia中解释的线性插值的C = 1变体进行计算:
percentile
percentile.inc
https://zh.wikipedia.org/wiki/Percentile#Second_variant.2C_.7F.27.22.60UNIQ-- postMath-00000043-QINU.60.22.27.7F
显然,我一直在使用的是平均经验分布。
因此,PostgreSQL的本机功能不能很好地工作,并且需要创建一个自定义功能,我将在完成后发布该功能。(我怀疑它会使用ntile9.4之前的旧方法,但仍会研究它)。
ntile
但是无论如何,这就是为什么它关闭了。