Giới hạn kết quả cho 2 hàng xếp hạng đầu tiên


22

Trong SQL Server 2008, tôi đang sử dụng RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)để trả về tập dữ liệu RANK. Nhưng tôi có hàng trăm bản ghi cho mỗi phân vùng, vì vậy tôi sẽ nhận được các giá trị từ xếp hạng 1, 2, 3 ...... 999. Nhưng tôi chỉ muốn tối đa 2 RANKstrong mỗi PARTITION.

Thí dụ:

ID   Name    Score    Subject
1    Joe      100      Math
2    Jim      99       Math
3    Tim      98       Math
4    Joe      99       History
5    Jim      100      History
6    Tim      89       History
7    Joe      80       Geography
8    Tim      100      Geography
9    Jim      99       Geography

Tôi muốn kết quả là:

SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC)
FROM Table
Subject        Name      Rank
Math           Joe        1
Math           Jim        2
History        Jim        1
History        Joe        2
Geography      Tim        1
Geography      Jim        2

Tôi muốn chỉ xếp hạng 1 và 2 trong mỗi thể loại. Làm thế nào để tôi làm điều này?

Câu trả lời:


15

Bạn có thể đặt truy vấn ban đầu bằng cách sử dụng rank()truy vấn con và bọc nó bằng truy vấn lọc kết quả.


Có ý nghĩa. Tôi ước Microsoft sẽ làm cho nó đơn giản hơn, tức là đặt một số trong hàm RANK. RANK(2) OVER (PARTITION BY Col2 ORDER B Y Col3) AS Top_2_Ranks. Có thể nó sẽ xảy ra trong phiên bản tương lai. Cảm ơn ý tưởng mặc dù.
UB01

@ UB01: Hoặc tốt hơn nữa, sẽ rất tuyệt nếu sử dụng các hàm cửa sổ trong một WHEREmệnh đề.
Jon của tất cả các giao dịch

16
select * from (
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
) a
where a.RN <= 2

0

Tôi nghĩ cách để làm điều này trong SQL Server là kết hợp chức năng cửa sổ với một biểu thức bảng chung:

with cte as (
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as ordinal
FROM Table
)
select * from cte where ordinal <= 2

-1

Đối với Teradara thay thế, bạn có thể làm:

SELECT 
Subject, 
Name, 
RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
QUALIFY a.RN <= 2

3
Chà, điều đó có thể ổn, nhưng câu hỏi cụ thể là về SQL Server.
dezso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.