2012-08-10 57 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