计算第N个百分位值我有数据,其中一些是NULL值,从中我希望提取单第90百分位数值柱:T-SQL:从
ColA
-----
NULL
100
200
300
NULL
400
500
600
700
800
900
1000
对于以上,我正在寻找一种技术,当搜索第90百分位时返回值900,第80百分位返回800.类似的函数可以是对于上述数据返回550的AVG(ColA),或者MIN(ColA )返回100等。
有什么建议吗?
计算第N个百分位值我有数据,其中一些是NULL值,从中我希望提取单第90百分位数值柱:T-SQL:从
ColA
-----
NULL
100
200
300
NULL
400
500
600
700
800
900
1000
对于以上,我正在寻找一种技术,当搜索第90百分位时返回值900,第80百分位返回800.类似的函数可以是对于上述数据返回550的AVG(ColA),或者MIN(ColA )返回100等。
有什么建议吗?
如果你想得到完全的第90百分位值,不包括NULL,我会建议直接进行计算。以下版本计算行的行数和数量,并选择适当的值:
select max(case when rownum*1.0/numrows <= 0.9 then colA end) as percentile_90th
from (select colA,
row_number() over (order by colA) as rownum,
count(*) over (partition by NULL) as numrows
from t
where colA is not null
) t
我把条件SELECT子句中,而不是在WHERE子句,这样您就可以轻松获得第50个百分点,17日,或任何你想要的值。
如果该操作只查找一个值为第90个percrntile,不应该是所有第90个petcentiles的平均值或中值?说,位置90.5而不是位置90.0? – MatBailie 2012-08-10 22:24:56
@Dems ...不完全。一般来说,如果存在的话,拆分值就是90%。在传统意义上,它是紧接在之前和之后的价值的平均值。我认为,第90块瓷砖的平均值更接近你的想法。一个有效的计算,但不会被称为第90百分位。对于重复值如何处理可能存在分歧,因为相同的值可能是第80百分位和第90位(在任一计算中)。 – 2012-08-10 22:50:02
对于迟到的“接受”道歉!你是我用过的答案,戈登。再次感谢。 – jbeldock 2014-01-24 01:50:22
WITH
percentiles AS
(
SELECT
NTILE(100) OVER (ORDER BY ColA) AS percentile,
*
FROM
data
)
SELECT
*
FROM
percentiles
WHERE
percentile = 90
注:如果数据低于100周的观察,并不是所有的百分位数将有一个值。同样,如果您有超过100个观察值,则某些百分位数将包含更多值。
用于'NTILE'。请注意,如果值小于100,则只能说50个值......那么百分位数将是“1 - 50”......所以如果超过90个值,则只有90个百分点。 – 2012-08-10 17:18:04
谢谢。这是朝着正确方向迈出的一步。我正在编辑我的帖子以指出其他两项要求:数据包含很多空值,并且应该忽略它们,我的目标是导出一个值(**第90百分位值)。 – jbeldock 2012-08-10 17:21:08
你会一直有10个非空值吗? – Paparazzi 2012-08-10 18:34:49