Você pode usar uma expressão de tabela comum (CTE) para derivar a resposta.
Digamos que você tenha os seguintes salários na tabela Salários:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Nós vamos usar:
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
Isso criará um número de linha para cada linha depois que ela for classificada pelo Salário em ordem decrescente e, em seguida, recuperará a terceira linha (que contém o terceiro registro mais alto).
- Fiddle SQL
Para aqueles que não querem um CTE (ou estão presos no SQL 2000):
[Observação :isso funciona visivelmente pior do que o exemplo acima; executá-los lado a lado com planos de execução mostra um custo de consulta de 36% para o CTE e 64% para a subconsulta]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
onde N é definido por você.
SalarySubquery
é o alias que dei para a subconsulta ou a consulta que está entre parênteses. O que a subconsulta faz é selecionar os N salários mais altos (diremos 3 neste caso), e os ordena pelo maior salário.
Se quisermos ver o terceiro salário mais alto, a subconsulta retornará:
Salary
-----------
80,000
72,000
50,000
A consulta externa seleciona o primeiro salário da subconsulta, exceto que desta vez estamos classificando-o em ordem crescente, que classifica do menor para o maior, de modo que 50.000 seria o primeiro registro classificado em ordem crescente.
Como você pode ver, 50.000 é de fato o terceiro salário mais alto no exemplo.