Cómo encontrar el salario más alto y más bajo nth / second en SQL

Según lo que he escuchado de amigos y otros usuarios en línea y de mi propia experiencia personal, la pregunta más común en la entrevista de trabajo para programadores de bases de datos es "¿Cómo encuentras el salario más alto en una mesa de empleados?"

Esta pregunta prueba el conocimiento de un candidato sobre funciones de clasificación, subconsultas, expresiones de tabla comunes (CTE) y SQL básico.

Exploraremos la respuesta con una serie de escenarios y preguntas en relación con la búsqueda del salario más alto, más bajo y más alto.

Vamos a crear una tabla de empleados y rellenarla con algunos datos de prueba.

SI OBJECT_ID (N'Employee ', N'U') NO ES UN NULL DROP TABLE Employee; CREAR TABLA Empleado (clave primaria de EmployeeId INT, salario numérico (18,2)); Insertar en valores de empleado (101,20000.00); Insertar en valores de empleado (102,25000.00); Insertar en valores de empleado (103,30000.00); Insertar en valores de empleado (104,35000.00); Insertar en valores de empleado (105,35000.00); Insertar en valores de empleado (106,45000.00); SELECCIONAR * DEL Empleado; 

Consulta 1.1 Encuentre al empleado con el salario más alto

SELECCIONE EmployeeId, Salary FROM (Seleccione EmployeeId, Salary, ROW_NUMBER () OVER (Orden por Salar Desc) como Salary_Order del Empleado) DT DONDE DT. Salary_Order = 1; 

La consulta anterior utiliza el concepto de tabla derivada, donde la subconsulta con función de clasificación row_number asigna un número secuencial único (1,2,3 ... a N) a un salario que se ordena en orden descendente (de mayor a menor). Por lo tanto, 1 se asignará al salario más alto, 2 al segundo salario más alto, etc., utilizando la tabla derivada para obtener la fila con el número de fila asignado como 1.

Consulta 1.2 Encuentre el empleado con el salario más alto cuando hay un empate (dos empleados tienen el salario más alto y el número es el mismo)

Estoy insertando un empleado más cuyo salario coincide con el salario más alto obtenido utilizando la Consulta 1.1 para demostrar este ejemplo.

Insertar en valores de empleado (107,45000.00); SELECCIONE EmployeeId, Salario DE (Seleccione EmployeeId, Salary, DENSE_RANK () OVER (Orden por Salar Desc) como Salary_Order del empleado) DT DONDE DT. Salary_Order = 1; 

Aquí estamos eliminando el ID de empleado 107 que habíamos insertado para la demostración de Query 1.2.

Eliminar del empleado donde EmployeeId = 107; 

En la consulta anterior, la función Dense_rank asigna el mismo número de rango consecutivo cuando hay un empate. Por lo tanto, asigna el número 1 a los dos salarios más altos (45,000), y ambos se devuelven utilizando la consulta de tabla derivada con el filtro Salario = 1.

Consulta 1.3 Encontrar al empleado con el segundo salario más alto

SELECCIONE EmployeeId, Salary FROM (Seleccione EmployeeId, Salary, ROW_NUMBER () OVER (Orden por Salar Desc) como Salary_Order del Empleado) DT DONDE DT. Salary_Order = 2; 

Aquí estamos usando la misma lógica utilizada en la Consulta 1.1 con la función ROW_NUMBER (), pero estamos usando Salary_order = 2 para obtener el segundo salario más alto.

Consulta 1.4 Encontrar al empleado con el enésimo salario más alto

SELECCIONE EmployeeId, Salary FROM (Seleccione EmployeeId, Salary, ROW_NUMBER () OVER (Orden por Salar Desc) como Salary_Order del Empleado) DT DONDE DT. Salary_Order = 4; 

Aquí estamos usando la misma lógica utilizada en Query 1.1 y Query 1.3. Nth significa que puede especificar cualquier número, y la consulta recuperará el salario en el número Nth.

Consulta 1.5 Encontrar al empleado con el salario más bajo

SELECCIONE EmployeeId, Salary FROM (Seleccione EmployeeId, Salary, ROW_NUMBER () OVER (Orden por Salario asc) como Salary_Order del Empleado) DT DONDE DT. Salary_Order = 1; 

Para encontrar el salario más bajo, estamos utilizando Orden por salario en orden ascendente, por lo que el resultado se clasifica en orden ascendente por salario (de menor a mayor). Por lo tanto, el salario más bajo obtendrá row_number = 1 y así sucesivamente. Estamos utilizando el filtro Salary_Order = 1 para recuperar el primer salario más bajo en la tabla de empleados.

Consulta 1.6 Cómo encontrar al empleado con el salario más bajo cuando hay un empate (ambos empleados tienen el salario más bajo y es el mismo)

Estoy insertando un empleado más cuyo salario coincide con el salario más bajo obtenido mediante la consulta anterior para demostrar este ejemplo.

Insertar en valores de empleado (109,20000.00); 
SELECCIONE EmployeeId, Salary FROM (Seleccione EmployeeId, Salary, DENSE_RANK () OVER (Orden de Salario asc) como Salary_Order del Empleado) DT DONDE DT. Salary_Order = 1; 

Aquí estamos eliminando el empleado con 108 id que se insertó para demostrar la consulta anterior.

eliminar del empleado donde employeeid = 109; 

Para encontrar el salario más bajo con vínculos, estamos usando la función dense_rank que es la misma que la Consulta 1.2. La función dense_rank asignará números consecutivos donde haya un salario duplicado, por lo que para el salario más bajo (20000.00), asignará el número 1 a ambos salarios. Usando el filtro Salary_Order = 1, podemos recuperar el salario más bajo cuando existe un empate usando la función dense_rank.

Consulta 1.7 Encontrar al empleado con el segundo salario más bajo

SELECCIONE EmployeeId, Salary FROM (Seleccione EmployeeId, Salary, ROW_NUMBER () OVER (Orden por Salario asc) como Salary_Order del Empleado) DT DONDE DT. Salary_Order = 2; 

Aquí estamos usando la misma lógica utilizada en la Consulta 1.3 con la función ROW_NUMBER (), pero estamos usando Salary_order = 2 para obtener el segundo salario más bajo.