2011-06-26 98 views
2

我想要一個計算字段,它給了我一個表中列值的百分位數。最好的辦法是什麼?SQL Server - 如何添加另一列的百分比值列?

我有一個表,只有一列包含值從0到10000,隨機分佈。我想添加另一列來告訴我同一行上的值與原始列中所有其他值的百分比。

這裏解釋了百分位數的2種定義:http://onlinestatbook.com/chapter1/percentiles.html

我正在使用我知道的定義。例如:一個值在第25百分位數表示25%的人口在AT或低於該值。

我想到的算法是下面,我希望有人能翻譯爲SQL適合我,因爲我是一個SQL初學者:

對於我的表中的所有行,如果該值小於或等於在當前行中賦值,然後計算++。在桌子的最後,我做了這個分區:計數/行數以得到我的百分數。這對我來說足夠準確,因爲有很多行。

+0

我們能確切知道是否有重複列?對於「百分位數」的含義,似乎也存在一些混淆,所以我真的建議添加一些樣本輸入和輸出來清除它。 –

+0

@Chris Cunningham:以下是百分位的含義:http://en.wikipedia.org/wiki/Percentile。是的,可以有重複,就像SAT分數有重複一樣。 – user776676

+0

給我們示例輸入和輸出。如果數字是1,2,3和4,你認爲1的「百分位數」是10還是0? –

回答

5

[編輯,以匹配問題的評論]:

SELECT Number, 100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*) AS Percentile 
FROM MyTable 

那麼如果你Number s爲2,5,10,14,你應該得到:

Number Percentile 
2  25 
5  50 
10  75 
14  100 

這裏的問題:如果有重複的,那麼ROW_NUMBER會讓你感到困擾。如果您Number s爲2,5,4,5和14,上面的代碼將會給你:

Number Percentile 
2  25 
5  50 
5  75 
14  100 

所以......做到這一點,而不是。

SELECT Number, MAX(100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*)) AS Percentile 
FROM MyTable 
GROUP BY Number 

如果你的數字是2,5,5,14,它應該返回

Number Percentile 
2  25 
5  75 
14  100 
+0

@Alex Aza:那麼百分位與上面的一樣。 –

+0

@Chris Cunningham:您的示例並不反映百分點的含義,因爲我理解它。請參考以下鏈接:http://en.wikipedia.org/wiki/Percentile – user776676

+1

從您的鏈接:「百分位數(或百分位數)是一個變量的數值,低於該數值百分之一的觀測值會下降。第20百分位數是低於20%的觀察值的值(或分數)。「我的5號線位於第25百分位,低於25%的觀測值可以找到。 –

1

您無法創建一個計算列,這個列將取決於其他行/表。

引用從MSDN

該表達式可以是是非計算 列名,常數,函數,和 任何這些由 一個或多個運算符連接的組合。表達式 不能是子查詢。

但是你可以做一個查詢:

設置:

declare @Test table (Value int) 

insert @Test 
values 
    (1), 
    (2), 
    (3), 
    (4), 
    (5), 
    (7), 
    (10) 

查詢:

select *, (select sum(Value) from @Test t2 where t2.Value <= t1.Value) * 100.0/sum(Value) over() 
from @Test t1 

結果:

Value  Percentile 
----------- --------------------------------------- 
1   3.125000000000 
2   9.375000000000 
3   18.750000000000 
4   31.250000000000 
5   46.875000000000 
7   68.750000000000 
10   100.000000000000 
+0

我已經添加了一些更多信息。大學委員會人員如何計算百分位數,我想知道?我希望能夠在我的桌子上做同樣的事情。 – user776676

+0

@ user776676 - 更新了答案。 –

+0

@@ user776676 - 讓我知道這是你需要的。 –

1
select CAST(SUM(CASE WHEN Number <= 20 
     THEN 1 ELSE 0 END) as float)/COUNT(*) as PercentileFor20 
from Numbers;