Puede usar una expresión de tabla común (CTE) para derivar la respuesta.
Supongamos que tiene los siguientes salarios en la tabla Salarios:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Usaremos:
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
Esto creará un número de fila para cada fila después de que haya sido ordenada por el Salario en orden descendente, luego recuperará la tercera fila (que contiene el tercer registro más alto).
- Violín SQL
Para aquellos de ustedes que no quieren un CTE (o están atascados en SQL 2000):
[Nota :esto funciona notablemente peor que el ejemplo anterior; ejecutarlos en paralelo con planes de ejecución muestra un costo de consulta del 36 % para el CTE y del 64 % para la subconsulta]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
donde N lo define usted.
SalarySubquery
es el alias que le he dado a la subconsulta, o la consulta que está entre paréntesis.
Lo que hace la subconsulta es seleccionar los N salarios principales (diremos 3 en este caso), y los ordena por el mayor salario.
Si queremos ver el tercer salario más alto, la subconsulta devolvería:
Salary
-----------
80,000
72,000
50,000
La consulta externa luego selecciona el primer salario de la subconsulta, excepto que esta vez lo estamos ordenando de forma ascendente, lo que lo hace de menor a mayor, por lo que 50 000 sería el primer registro ordenado de forma ascendente.
Como puede ver, 50.000 es de hecho el tercer salario más alto en el ejemplo.