手动计算90分位数与percentile_cont函数结果不一致,原因何在?
问题分析:手动计算分位数与
percentile_cont结果差异的原因 核心结论
你遇到的差异不是z-score精度问题,而是对分位数计算逻辑的概念误解——用z-score推导分位数的方法仅适用于正态分布数据,但你的数据集是均匀分布,完全不满足这个前提,因此结果自然和percentile_cont的计算结果不符。
具体解释
percentile_cont(.90)的计算逻辑percentile_cont是连续型分位数函数,它的计算完全基于数据的有序位置:- 你的数据集是1到1000的连续整数,共1000条数据。
- 90分位数的位置为
n * p = 1000 * 0.9 = 900(n是数据量,p是分位比例)。 - 因为是连续型分位数,函数会在第900个值(900)和第901个值(901)之间做线性插值,结果为
(900 + 901) / 2 = 900.1,和你得到的结果一致。
z-score法的适用场景
你用的1.28155是标准正态分布下的90%分位数对应的z值,这个方法的逻辑是:分位数 = 均值 + z值 * 标准差但这个公式成立的前提是数据服从正态分布。而你的数据集是1到1000的均匀分布,均值为500.5,标准差约288.675,代入公式得到的870.6是正态分布假设下的结果,和实际数据的分位数没有对应关系。
你的SQL代码与执行结果
select round(((1.28155 * stddev(num)) + avg(num)),1) as my_number, percentile_cont(.90) within group ( order by num) as NINETIETH from ( select level as num from dual connect by level <= 1000 )
执行结果:
| MY_NUMBER | NINETIETH |
|---|---|
| 870.6 | 900.1 |
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

