2013-10-29 121 views
1

我想弄清楚如何計算給定數據集的第95百分位數值。我可以使用下面的T-SQL從數據集中獲得第95百分位數值,但下面的代碼總是會給我數據集中的值計算第95百分位值,但不一定從數據集

SELECT MIN(Value) 
FROM 
(
    SELECT TOP 95 PERCENT WITH TIES Value 
    FROM [Sample].[dbo].[numbers] 
    ORDER BY Value DESC 
) AS Temp 

例如,對於該數據集23,5,11,22,25,14,第95百分位值是24.5%的Excel,但SQL Server不會返回該值,因爲它不在數據集中。

任何人都可以請建議,如果他們有任何建議?

在此先感謝您的幫助。

+0

有百分之一以上的類型,所以你必須知道你想要哪一個。單獨使用sql可能是不可能的。當我不得不做這樣的事情時,我從sql獲得了記錄,並用ColdFusion計算了百分比。 –

+0

你怎麼得到24.5? – sgeddes

+0

@sgeddes。 。 。它正在對分配做出激進的假設。我認爲正確答案是25,這是SQL應該返回的內容。 Excel中插值的可能原因是在有偶數行時處理中位數。即便如此,兩個中間值之間的所有數字都是同樣有效的,所以有一個參數用於介於兩個中間值之間的任何值,甚至是兩個端點之一。 –

回答

0

它看起來像你想要一個「插值」中位數。 Yucch。但是,你可以用SQL來做到這一點。只是在計算中明確:

select (max(case when rownum <= 0.95 * total then value end) + 
     min(case when rownum >= 0.95 * total then value end) 
     )/2.0 as Interpolated_95th 
from (SELECT n.*, row_number() over (order by value) as rownum, 
      count(*) over() as total 
     FROM [Sample].[dbo].[numbers] n 
    ) t 

注意這在有確切的20行(所以95個百分點將在19倍的位置)的倍數的情況下,因爲平等的 - min()max()將是相同的。如果在其他情況下也起作用,則始終在兩個值之間的中間位置返回點。

注意:我並不認爲這比SQL返回的值更有效。根據中位數和百分位數的定義,兩者之間的任何值都是同樣有效的,並且對於使用任何一種極端情況都有一個很好的論點。也就是說,我可以非常欣賞在現實世界中,你可能必須這樣做。

+0

感謝您的幫助。如果行數不是20的倍數,您能否確認上述邏輯是否不起作用?再次感謝/ – sam

+0

@ sam1980。 。 。上面的代碼用於內插值(ala Excel),而不管值的數量。 –