Можете да използвате Common Table Expression (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
Това ще създаде номер на ред за всеки ред, след като бъде сортиран по заплата в низходящ ред, след което ще извлече третия ред (който съдържа третия най-висок запис).
- SQL Fiddle
За тези от вас, които не искат 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 наистина е третата най-висока заплата в примера.