Du kan använda ett Common Table Expression (CTE) för att härleda svaret.
Låt oss säga att du har följande löner i tabellen Löner:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Vi kommer att använda:
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
Detta kommer att skapa ett radnummer för varje rad efter att den har sorterats efter lön i fallande ordning, och sedan hämta den tredje raden (som innehåller den tredje högsta posten).
- SQL-fiol
För er som inte vill ha en CTE (eller har fastnat i SQL 2000):
[Obs :detta presterar märkbart sämre än exemplet ovan; att köra dem sida vid sida med en exekutionsplan visar en frågekostnad på 36 % för CTE och 64 % för underfrågan]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
där N definieras av dig.
SalarySubquery
är det alias jag har gett till underfrågan, eller frågan som står inom parentes.
Vad underfrågan gör är att den väljer de högsta N-lönerna (vi säger 3 i detta fall), och beordrar dem med den högsta lönen.
Om vi vill se den tredje högsta lönen skulle underfrågan returnera:
Salary
-----------
80,000
72,000
50,000
Den yttre frågan väljer sedan den första lönen från underfrågan, förutom att vi sorterar den stigande den här gången, som sorterar från minsta till största, så 50 000 skulle vara den första posten sorterade stigande.
Som du kan se är 50 000 verkligen den tredje högsta lönen i exemplet.