2012-08-10 54 views
5

计算第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等。

有什么建议吗?

+0

你会一直有10个非空值吗? – Paparazzi 2012-08-10 18:34:49

回答

9

如果你想得到完全的第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日,或任何你想要的值。

+0

如果该操作只查找一个值为第90个percrntile,不应该是所有第90个petcentiles的平均值或中值?说,位置90.5而不是位置90.0? – MatBailie 2012-08-10 22:24:56

+0

@Dems ...不完全。一般来说,如果存在的话,拆分值就是90%。在传统意义上,它是紧接在之前和之后的价值的平均值。我认为,第90块瓷砖的平均值更接近你的想法。一个有效的计算,但不会被称为第90百分位。对于重复值如何处理可能存在分歧,因为相同的值可能是第80百分位和第90位(在任一计算中)。 – 2012-08-10 22:50:02

+0

对于迟到的“接受”道歉!你是我用过的答案,戈登。再次感谢。 – jbeldock 2014-01-24 01:50:22

4
WITH 
    percentiles AS 
(
    SELECT 
    NTILE(100) OVER (ORDER BY ColA) AS percentile, 
    * 
    FROM 
    data 
) 
SELECT 
    * 
FROM 
    percentiles 
WHERE 
    percentile = 90 


注:如果数据低于100周的观察,并不是所有的百分位数将有一个值。同样,如果您有超过100个观察值,则某些百分位数将包含更多值。

+0

用于'NTILE'。请注意,如果值小于100,则只能说50个值......那么百分位数将是“1 - 50”......所以如果超过90个值,则只有90个百分点。 – 2012-08-10 17:18:04

+0

谢谢。这是朝着正确方向迈出的一步。我正在编辑我的帖子以指出其他两项要求:数据包含很多空值,并且应该忽略它们,我的目标是导出一个值(**第90百分位值)。 – jbeldock 2012-08-10 17:21:08