Вы можете использовать общее табличное выражение (CTE), чтобы получить ответ.
Допустим, у вас есть следующие зарплаты в таблице Зарплаты:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Мы будем использовать:
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
Это создаст номер строки для каждой строки послеон был отсортирован по зарплате в порядке убывания, а затем извлечен третий ряд (который содержит третью по величине запись).
Для тех из вас, кто не хочет CTE (или застрял в SQL 2000):
[ Примечание : это заметно хужечем приведенный выше пример;их параллельное выполнение с планами исключений показывает стоимость запроса 36% для CTE и 64% для подзапроса]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
, где N определено вами.
SalarySubquery
- это псевдоним, который я дал подзапросу, или запрос в скобках.
Что делает подзапрос, он выбирает верхние N зарплат (в данном случае мы скажем 3 ) и упорядочивает их по наибольшей зарплате.
Если мы хотим увидеть третий по величине оклад, подзапрос вернет:
Salary
-----------
80,000
72,000
50,000
Внешний запрос затем выбирает первый оклад из подзапроса, за исключением того, что мы сортируем его по возрастаниюна этот раз, который сортируется от наименьшего к наибольшему, поэтому 50 000 будет первой отсортированной записью по возрастанию.
Как видите, 50 000 - это действительно третья самая высокая зарплата в примере.