2012-03-22 30 views
6

Cần tính toán xếp hạng phần trăm (tỷ lệ phần trăm 1 đến 99) cho mỗi học sinh có điểm cho một bài kiểm tra.Tính Xếp hạng Phần trăm sử dụng NTILE?

Tôi hơi bối rối bởi định nghĩa msdn là NTILE, vì nó không đề cập rõ ràng về xếp hạng phần trăm. Tôi cần một số loại bảo đảm rằng NTILE là từ khóa chính xác để sử dụng để tính toán xếp hạng phần trăm.

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 

Có vẻ đúng với tôi, nhưng đây có phải là cách chính xác để tính xếp hạng phần trăm không?

Trả lời

0

Có lỗi đánh máy không?

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

Và tập lệnh của bạn có vẻ tốt. Nếu bạn nghĩ có điều gì đó sai trái, bạn có thể làm rõ điều gì một cách chính xác không?

+0

Bắt tốt. Tôi đã cập nhật câu trả lời của mình. –

+0

Tài liệu này không bao giờ đề cập một cách rõ ràng mối quan hệ giữa xếp hạng ntile và phần trăm, vì vậy tôi hơi lo ngại rằng tôi chỉ nhận được một kết quả dương tính giả. Cần một số loại bảo đảm đây là cách chính xác. –

1

Có vấn đề với mã của bạn khi phân phối NTILE không đồng bộ. Nếu bạn có 213 sinh viên, 13 nhóm hàng đầu sẽ có 3 sinh viên và 87 sinh viên sẽ có 2 sinh viên. Đây không phải là điều bạn lý tưởng muốn trong phân phối phần trăm.

Bạn có thể muốn sử dụng RANK/ROWNUM và sau đó chia để nhận nhóm% ile.

+0

Bạn có thể hiển thị ví dụ về điều đó trong SQL không? –

3

NTILE hoàn toàn KHÔNG giống như xếp hạng phần trăm. NTILE chỉ đơn giản là chia một tập hợp các dữ liệu đồng đều bằng số được cung cấp (như được ghi chú bởi RoyiNamir ở trên). Nếu bạn biểu đồ kết quả của cả hai hàm, NTILE sẽ là một tuyến hoàn toàn tuyến tính từ 1 đến n, trong khi xếp hạng phần trăm sẽ [thường] có một số đường cong cho nó tùy thuộc vào dữ liệu của bạn.

Xếp hạng phần trăm phức tạp hơn nhiều so với việc chia nó bằng N. Sau đó, số lượng và số liệu của mỗi hàng nằm trong phân bố nằm ở đâu, nội suy khi cần thiết (rất nhiều CPU). Tôi có một bảng Excel 525.000 hàng và nó thống trị CPU 8 lõi của máy tính của tôi ở 100% trong 15-20 phút chỉ để tìm ra hàm PERCENTRANK cho một cột đơn.

Bài viết này cung cấp một lời giải thích tốt hơn trăm bậc và làm thế nào để làm điều đó trong SQL:

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

1

Một cách để nghĩ về điều này là, "tỷ lệ sinh viên có Điểm dưới đây này"

Dưới đây là một cách để nhận được rằng loại phần trăm trong SQL Server, sử dụng RANK():

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

Lưu ý rằng điều này sẽ luôn được ít hơn 100%, trừ khi bạn làm tròn lên, và bạn sẽ luôn luôn nhận được 0% cho (các) giá trị thấp nhất. Điều này không nhất thiết đặt giá trị trung bình ở mức 50%, cũng như không nội suy như một số tính toán phân vị.

Vui lòng làm tròn hoặc truyền toàn bộ biểu thức (ví dụ: cast(... as decimal(4,2))) để có báo cáo tìm kiếm đẹp hoặc thậm chí thay thế - 1.0 bằng - 1e để buộc tính toán dấu phẩy động.

NTILE() không thực sự là những gì bạn đang tìm kiếm trong trường hợp này bởi vì về cơ bản chia số hàng của tập hợp đặt hàng thành nhóm thay vì giá trị. Nó sẽ chỉ định một phần trăm khác nhau cho hai trường hợp có cùng giá trị nếu các trường hợp đó xảy ra để làm cho một điểm chéo chéo.Bạn phải sau đó thêm nhóm theo giá trị đó và lấy phần trăm tối đa hoặc tối thiểu của nhóm để sử dụng NTILE() giống như cách chúng tôi đang thực hiện với RANK().

0

Tôi biết đây là một chủ đề cũ nhưng chắc chắn có rất nhiều thông tin sai lệch về chủ đề này làm cho nó là cách trên internet.

NTILE không được thiết kế để tính toán thứ hạng phần trăm (AKA trăm rank)

Nếu bạn đang sử dụng NTILE để tính Xếp hạng Percent bạn đang làm nó sai. Bất cứ ai nói với bạn về mặt khác đều bị hiểu sai và nhầm lẫn. Nếu bạn đang sử dụng NTILE (100) và nhận được câu trả lời đúng hoàn toàn trùng hợp ngẫu nhiên của nó.

Tim Lehner giải thích vấn đề một cách hoàn hảo.

"Nó sẽ chỉ định một phần trăm khác nhau cho hai trường hợp có cùng giá trị nếu những trường hợp đó xảy ra để điều chỉnh điểm chéo."

Nói cách khác, sử dụng NTILE để tính nơi sinh viên xếp hạng dựa trên điểm kiểm tra của họ có thể dẫn đến hai học sinh có cùng điểm kiểm tra nhận được các giá trị xếp hạng phần trăm khác nhau. Ngược lại, hai học sinh có điểm số khác nhau có thể nhận được cùng một hạng phần trăm.

Để có giải thích chi tiết hơn về lý do tại sao NTILE là công cụ sai cho công việc này cũng như thay thế hiệu quả tốt hơn cho percent_rank, hãy xem: PERCENT_RANK nhanh khó chịu. http://www.sqlservercentral.com/articles/PERCENT_RANK/141532/