sql >> Base de Datos >  >> RDS >> Sqlserver

Consulta SQL para encontrar el enésimo salario más alto de una tabla de salarios

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.