È possibile utilizzare una Common Table Expression (CTE) per derivare la risposta.
Supponiamo che tu abbia i seguenti stipendi nella tabella Stipendi:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Useremo:
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
Questo creerà un numero di riga per ogni riga dopo che è stata ordinata in base allo stipendio in ordine decrescente, quindi recupererà la terza riga (che contiene il terzo record più alto).
- SQL Fiddle
Per quelli di voi che non vogliono un CTE (o sono bloccati in SQL 2000):
[Nota :questo funziona notevolmente peggio dell'esempio sopra; eseguirli fianco a fianco con un piano di esecuzione mostra un costo della query del 36% per il CTE e del 64% per la sottoquery]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
dove N è definito da te.
SalarySubquery
è l'alias che ho dato alla sottoquery o la query che è tra parentesi.
Quello che fa la sottoquery è selezionare i primi N stipendi (diremo 3 in questo caso) e li ordina per lo stipendio più alto.
Se vogliamo vedere il terzo stipendio più alto, la sottoquery restituirà:
Salary
-----------
80,000
72,000
50,000
La query esterna seleziona quindi il primo stipendio dalla sottoquery, tranne per il fatto che questa volta lo stiamo ordinando in ordine crescente, che ordina dal più piccolo al più grande, quindi 50.000 sarebbe il primo record ordinato in modo crescente.
Come puoi vedere, 50.000 è effettivamente il terzo stipendio più alto nell'esempio.