所以,我最初并不知道有一个
percentile_cont
函数,我试图通过查找 z 分数 (1.28155) 并进行数学计算来计算数字 z 系列的第 90 个百分位。但我的实现和内置函数之间的数字越来越不一致。这是因为我的 z 分数不准确还是我只是误解了某些内容?
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 | 第九十 |
---|---|
870.6 | 900.1 |
z-score 假设分布是正态分布。
生成的值是正态分布的第 90 个百分位,其平均值和标准差与您的数据相同。不幸的是,您的分布不是正态分布。
如果生成正态分布:
SELECT ROUND(1.28155 * s.stddev + s.mean,1) AS my_number,
( SELECT PERCENTILE_CONT(.90) WITHIN GROUP (
ORDER BY DBMS_RANDOM.NORMAL() * s.stddev + s.mean
)
FROM DUAL
CONNECT BY LEVEL <= 1000
) AS NINETIETH
FROM (SELECT 500 AS mean, 250 AS stddev FROM DUAL) s
那么输出可能(随机)是:
MY_NUMBER | 第九十 |
---|---|
820.4 | 818.176123750928889247317476609317779925 |