Du kan bruge et almindeligt tabeludtryk (CTE) til at udlede svaret.
Lad os sige, at du har følgende lønninger i tabellen Lønninger:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Vi bruger:
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
Dette vil oprette et rækkenummer for hver række, efter at det er blevet sorteret efter løn i faldende rækkefølge, og derefter hentes den tredje række (som indeholder den tredje-højeste post).
- SQL Fiddle
Til dem af jer, der ikke ønsker en CTE (eller sidder fast i SQL 2000):
[Bemærk :dette fungerer mærkbart dårligere end ovenstående eksempel; at køre dem side om side med en udførelsesplan viser en forespørgselsomkostning på 36 % for CTE og 64 % for underforespørgslen]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
hvor N er defineret af dig.
SalarySubquery
er det alias jeg har givet til underforespørgslen, eller forespørgslen der står i parentes.
Hvad underforespørgslen gør, er, at den vælger de bedste N-lønninger (vi siger 3 i dette tilfælde), og beordrer dem efter den største løn.
Hvis vi ønsker at se den tredje højeste løn, vil underforespørgslen returnere:
Salary
-----------
80,000
72,000
50,000
Den ydre forespørgsel vælger derefter den første løn fra underforespørgslen, bortset fra at vi sorterer den stigende denne gang, som sorterer fra mindste til største, så 50.000 ville være den første post, der sorteres stigende.
Som du kan se, er 50.000 faktisk den tredje højeste løn i eksemplet.