使用百分位数函数,但我没有得到所需的输出。我会说“不正确”,但这些功能可能按预期工作,而我只是没有正确理解它们。
这些是我正在处理的数字:
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)个数为奇数,则选中间的数字;如果数字是偶数,则将中间的两个数字平均。所以在这种情况下,有 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;
注:不存在以下情况removed
is not NULL
.
我需要做什么才能使其正常且一致地工作?我需要编写一个函数来检查n
首先在决定之前percentile_disc
or percentile_cont
基于它是偶数还是奇数?
SQL 小提琴:http://sqlfiddle.com/#!17/aa09c/9 http://sqlfiddle.com/#!17/aa09c/9