2012-03-22 95 views
6

需要爲每位學生計算百分位數(第1百分位至第99百分位數),併爲單次測驗評分。使用NTILE計算百分等級?

我有點困惑於NTILE的msdn定義,因爲它沒有明確提及百分等級。我需要某種保證NTILE是用於計算百分等級的正確關鍵字。

declare @temp table 
(
    StudentId int, 
    Score int 
) 
insert into @temp 
select 1, 20 
union 
select 2, 25 
..... 

select NTILE(100) OVER (order by Score) PercentileRank 
from @temp 

它看起來對我很正確,但這是計算百分等級的正確方法嗎?

回答

0

是否有拼寫錯誤?

select NTILE(100) OVER (order by Score) PercentileRank 
from @temp 

而你的腳本看起來不錯。如果你覺得有什麼問題,你能澄清一下嗎?

+0

好的。我更新了我的答案。 – 2012-03-22 19:50:43

+0

該文檔從未明確提及過ntile和百分位數級別之間的關係,所以我有點偏好,我只是得到了誤報。需要某種保證,這是正確的方法。 – 2012-03-22 19:54:17

1

由於NTILE發行版不統一,您的代碼存在問題。如果你有213名學生,最多的13個組將有3名學生,後面的87名學生各有2名學生。這不是理想情況下想要的百分比分佈。

您可能想要使用RANK/ROWNUM,然後除以得到%ile組。

+0

你可以在SQL中顯示一個例子嗎? – 2012-05-01 14:38:44

3

NTILE絕對不是百分等級。 NTILE只是按照提供的數字平均分配一組數據(如上面的RoyiNamir所述)。如果您繪製這兩種函數的結果,NTILE將是一對一的完美線性線,而百分位等級[通常]會根據您的數據有一些曲線。

百分位數比簡單地將它分爲N要複雜得多。然後它取每行的數字並計算出它所處的分佈位置,並在必要時進行插值(這非常耗費CPU)。我有一個525,000行的Excel工作表,它可以在100%的時間內控制我的8核機器的CPU,持續15-20分鐘,以便找出單個列的PERCENTRANK函數。

本文提供百分秩的一個更好的解釋,以及如何做到這一點的SQL:想這是

http://sqlmag.com/t-sql/calculate-percentiles

1

的一種方式,「低於這個分數的學生比例」

這裏是獲得該類型的SQL Server百分的一種方式,用RANK()

select * 
    , (rank() over (order by Score) - 1.0)/(select count(*) from @temp) * 100 as PercentileRank 
from @temp 

注意這將永遠是小於100%,除非你圓了,你總是會得到0%爲最低值(s)。這並不一定會將中值計算在50%,也不會像一些百分比計算那樣插值。

您可以自由地將整個表達式(例如cast(... as decimal(4,2)))換成好看的報表,或者甚至用- 1e替換- 1.0來強制執行浮點計算。

NTILE()在這種情況下並不是真正需要的,因爲它實質上是將有序集的行號劃分爲組而不是數值。如果這些實例碰巧跨越交叉點,它將爲具有相同值的兩個實例分配不同的百分位數。您必須另外按該值進行分組,然後按照與RANK()相同的方式使用NTILE()來獲取組的最大或最小百分位數。

0

我知道這是一個古老的線程,但肯定有很多關於這個主題的錯誤信息,使它圍繞着互聯網。

NTILE不用於計算百分等級(AKA百分秩)

如果使用NTILE來計算你做錯了百分秩次。任何告訴你的人都是錯誤的和錯誤的。如果你使用NTILE(100)並且得到正確的答案,那純粹是巧合。

Tim Lehner完美地解釋了這個問題。

「如果這些實例碰巧跨越交叉點,它將爲相同值的兩個實例分配不同的百分位數。」

換句話說,使用NTILE來計算學生根據他們的考試成績排名的位置可能導致兩名學生的測試成績完全相同,並得到不同的百分比排名值。相反,兩名分數不同的學生可以獲得相同的百分比排名。

有關NTILE是此作業的錯誤工具的更詳細解釋以及百分比排序的深刻更好的替代方法,請參閱:令人討厭的快速PERCENT_RANK。 http://www.sqlservercentral.com/articles/PERCENT_RANK/141532/