soc*_*pet 5 sql database postgresql
使用百分位数函数,但我没有得到所需的输出。我会说“不正确”,但这些功能可能按预期工作,而我只是没有正确理解它们。
这些是我正在处理的数字:
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
Run Code Online (Sandbox Code Playgroud)
我的理解percentile_cont
是,如果计数为偶数,它将聚合两个数字,因为它将把它们相加,然后除以二。我的理解percentile_disc
是,如果计数是偶数,它只会选择最小的数字。
这是我对使用第 50 个(中位数)计算百分位数的理解:
若数字(n)个数为奇数,则选中间的数字;如果数字是偶数,则将中间的两个数字平均。所以在这种情况下,有 32 个数字,所以中位数 = (358625 + 364999.92) / 2 = 361812.46
。percentile_cont
返回正确的值,因为它对两个值求平均值;percentile_disc
返回不正确的值,因为它选择了两者中最低的值。
对于其他百分位数,例如第 10 个百分位数,我的理解是,将百分位数乘以数字数量 (n) 即可得到索引:.10 * 32 = 3.2 index
在本例中。然后,您应该四舍五入到最接近的整数,这就是您的百分位数。如果索引是整数,则将索引中的数字与其后面的数字进行平均。
在这种情况下,percentile_cont
是错误的,因为它返回的值251500
甚至不是我能得到的数字。我能得到的最接近的是平均值,24000, 250000, 265000
即251666.67
。percentile_disc
返回 的正确结果250000
。
但真正的亮点是这个:75 号。469250
根据我的计算应该会返回。index = (32*.75) = 24
,该索引的结果应该是(463500 + 475000) = 469250
。percentile_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;
Run Code Online (Sandbox Code Playgroud)
removed
注:不存在不存在的情况NULL
。
我需要做什么才能使其正常且一致地工作?我是否需要编写一个函数,n
在决定之前先检查它是percentile_disc
偶数percentile_cont
还是奇数?
将此问题发布到 Reddit 并获得了一些帮助。
显然,percentile_cont
除了Excel 中的percentile
和percentile.inc
函数之外,该函数还使用线性插值的 C=1 变体进行计算,如维基百科中所述:
显然,我一直在使用的称为平均经验分布。
因此 PostgreSQL 的本机函数不会很好地工作,需要创建一个自定义函数,我将在完成后发布该函数。(我怀疑它会使用9.4之前的旧ntile
方法,但仍在研究中)。
但无论如何,这就是它关闭的原因。
归档时间: |
|
查看次数: |
2486 次 |
最近记录: |