Bạn có thể sử dụng Biểu thức Bảng Chung (CTE) để tìm ra câu trả lời.
Giả sử bạn có các mức lương sau trong bảng Mức lương:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Chúng tôi sẽ sử dụng:
DECLARE @N int
SET @N = 3 -- Change the value here to pick a different salary rank
SELECT Salary
FROM (
SELECT row_number() OVER (ORDER BY Salary DESC) as SalaryRank, Salary
FROM Salaries
) as SalaryCTE
WHERE SalaryRank = @N
Thao tác này sẽ tạo một số hàng cho mỗi hàng sau khi nó đã được sắp xếp theo Mức lương theo thứ tự giảm dần, sau đó truy xuất hàng thứ ba (chứa bản ghi cao thứ ba).
- SQL Fiddle
Đối với những bạn không muốn có CTE (hoặc bị mắc kẹt trong SQL 2000):
[ Lưu ý :điều này hoạt động kém hơn đáng kể so với ví dụ trên; chạy chúng song song với một kế hoạch đặc biệt cho thấy chi phí truy vấn là 36% cho CTE và 64% cho truy vấn phụ]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
trong đó N do bạn xác định.
SalarySubquery
là bí danh tôi đã đặt cho truy vấn con hoặc truy vấn nằm trong dấu ngoặc đơn.
Những gì truy vấn con làm là nó chọn N mức lương cao nhất (chúng tôi sẽ nói 3 trong trường hợp này), và đặt hàng họ theo mức lương cao nhất.
Nếu chúng ta muốn xem mức lương cao thứ ba, truy vấn con sẽ trả về:
Salary
-----------
80,000
72,000
50,000
Sau đó, truy vấn bên ngoài sẽ chọn mức lương đầu tiên từ truy vấn con, ngoại trừ lần này chúng tôi sắp xếp nó tăng dần, sắp xếp từ nhỏ nhất đến lớn nhất, vì vậy 50.000 sẽ là bản ghi đầu tiên được sắp xếp tăng dần.
Như bạn có thể thấy, 50.000 thực sự là mức lương cao thứ ba trong ví dụ này.