計算第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