sql >> Base de Datos >  >> RDS >> Database

enésimo salario más alto

La pregunta más común e importante que se hace en las entrevistas es cómo podemos encontrar el enésimo salario más alto en una tabla (2 salario más alto, 3 salario más alto o enésimo salario más alto), donde N podría ser 2, 3, 4, 5 o cualquier cosa.

Cada programador sabe que la forma más fácil de encontrar el salario n más alto es usando SQL (lenguaje de consulta estructurado) en una tabla.

Cada vez que el entrevistador le haga una pregunta sobre los 2 salarios más altos, los 4 salarios más altos, etc., para resolver esta pregunta, debemos conocer algunos conceptos importantes como una subconsulta, función que se utilizará como fila_num(), Rango Rango () , etc.

Este artículo le permitirá conocer diferentes formas de encontrar el N salario más alto.

Considere las tablas existentes que tienen los siguientes registros:

Tabla:Empleados

ID DE EMPLEADO FIRST_NAME APELLIDO SALARIO CIUDAD DEPARTAMENTO ID DE ADMINISTRADOR
1001 VAIBHAVI MISHRA 65500 PUNE ORACULO 1
1002 VAIBHAV SHARMA 60000 NOIDA C# 5
1003 NIKHIL VANI 50500 JAIPUR FMW 2
2001 PRACHI SHARMA 55500 CHANDIGARH ORACULO 1
2002 BHAVESH JAÍN 65500 PUNE FMW 2
2003 RUCHIKA JAÍN 50000 BOMBAY C# 5
3001 PRANOTI SHENDE 55500 PUNE JAVA 3
3002 ANUJA WANRE 50500 JAIPUR FMW 2
3003 DEEPAM JAUHARI 58500 BOMBAY JAVA 3
4001 RAJESH GOUD 60500 BOMBAY PRUEBA 4
4002 ASHWINI BAGHAT 54500 NOIDA JAVA 3
4003 RUCHIKA AGARWAL 60000 DELHI ORACULO 1
5001 ARCHIT SHARMA 55500 DELHI PRUEBA 4

N salario más alto utilizando una subconsulta correlacionada

Una subconsulta correlacionada es un tipo especial de subconsulta, donde la subconsulta depende de la consulta principal y se ejecuta para cada fila devuelta por la consulta principal.

Sintaxis:

SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Donde N se puede reemplazar con los números 23 o 4.

Ejemplo 1: Escribe una consulta para encontrar los 4 salarios más altos:

SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Donde N =4, N -1:4 -1 =3.

4 salario más alto de la mesa

Salida:

Employeeid Salario
3003 58500

Explicación:

La palabra clave distintiva está ahí para manejar los salarios duplicados en la tabla. Para buscar el N salario más alto, solo consideramos los salarios no duplicados. El salario más alto significa que ningún salario es más alto que él. El segundo salario más alto significa que solo un salario es mayor que él. El tercer salario más alto significa que solo dos salarios son más altos que el tercer salario, de manera similar, el enésimo salario más alto significa que los salarios N-1 son más altos que este.

El cuarto salario más alto es 58500 del ID de empleado 3003.

Ejemplo 2:escribe una consulta para encontrar los 3 salarios más altos:

SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Donde N =3, N -1:3 -1 =2.

2 salario más alto de la mesa

Salida:

Employeeid Salario
1002 60000
4003 60000

El segundo salario más alto es 58500 de dos id de empleado 1002 y id de empleado 4003.

Ejemplo 3:escribe una consulta para encontrar los 5 salarios más altos:

SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Donde N =6, N -1:6 -1 =5.

5 salario más alto de la tabla

Salida:

Employeeid Salario
4002 54500

El quinto salario más alto es 54500 del ID de empleado 4002.

N Salario más alto usando LIMIT palabra clave

Sintaxis:

SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;

Ejemplo 1: Escribe una consulta para encontrar los 2 salarios más altos.

SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;

Salida:

Employeeid Salario
2002 65500

Límite 1, 1 en la consulta dice cuánto se debe mostrar el salario más alto.

Si escribes 1, 2 salidas serán así

Employeeid Salario
2002 65500
4001 60500

N Salario más alto utilizando la palabra clave TOP

El escenario es calcular el N salario de empleado más alto de la tabla de empleados. Los pasos son los siguientes:

1. El primer paso es buscar el salario único TOP de los empleados de la tabla.
2. El siguiente paso es calcular el salario mínimo entre todos los salarios resultantes del primer paso. En este paso, obtenemos N salario más alto.
3. A partir del resultado de los pasos anteriores, identifique los detalles del empleado cuyo salario es el salario mínimo.

Ejemplo 1:

SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));

La declaración SQL anterior se usa para encontrar los detalles de los empleados con el salario más alto.

Veamos brevemente la explicación de la sentencia SQL anterior:

Considere N =4.

Cada vez que una consulta SQL incluya una subconsulta, recuerde que la consulta interna se ejecutará primero y luego se ejecutará la consulta externa.

El siguiente resultado será generado por la consulta "SELECCIONE DISTINCT TOP N salario de empleados ORDENAR POR salario DESC", que generará el siguiente resultado.

Salario
65500
60500
60000
58500

La siguiente consulta externa es:"SELECCIONE MIN(salario) DE los empleados DONDE ENTRA el salario (el resultado de una consulta SQL anterior.

Salario
58500

Del resultado anterior, se verifica que el cuarto salario más alto requerido es 58500.

Por último, la consulta principal es SELECCIONAR * DE empleados DONDE salario =resultado de la consulta SQL anterior. El resultado de esta consulta será el resultado de los empleados que tienen el cuarto salario más alto.

FIRST_NAME SALARIO
DEEPAM 58500

Ejemplo 2:

SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));

La declaración SQL anterior se usa para encontrar los detalles de los empleados con el salario más alto N.

Veamos brevemente la explicación de la sentencia SQL anterior:

Considere N =5.

Cada vez que una consulta SQL incluya una subconsulta, recuerde que la consulta interna se ejecutará primero y luego se ejecutará la consulta externa.

El siguiente resultado será generado por la consulta "SELECCIONE DISTINCT TOP N salario de empleados ORDENAR POR salario DESC", que generará el siguiente resultado.

Salario
65500
60500
60000
58500
55500

La siguiente consulta externa es:"SELECCIONE MIN(salario) DE los empleados DONDE ENTRA el salario (el resultado de una consulta SQL anterior.

Salario
55500

Del resultado anterior, se verifica que el quinto salario más alto requerido es 55500.

Por último, la consulta principal es SELECCIONAR * DE empleados DONDE salario =resultado de la consulta SQL anterior. El resultado de esta consulta será el resultado de los empleados que tengan el quinto salario más alto.

FIRST_NAME SALARIO
PRACHI 55500

Enésimo salario más alto usando la función Row_Num()

Ejemplo:

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;
  • Para calcular el tercer salario más alto, use rownum <4
  • Para calcular el segundo salario más alto, use rownum <3

Salida:

MIN(salario
60500

Veamos cómo funciona la consulta:

Paso 1: La consulta incluye subconsulta significa consulta interna y consulta externa. Todos sabemos cuándo se usa la subconsulta en la consulta, primero se ejecuta la consulta interna

Primero, la consulta interna se ejecutará y luego las consultas externas se ejecutarán en función del resultado producido por la consulta interna:

Consulta interna:

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

Resultado de la consulta interna:

Salario
65500
60500
60000
58500
55500
54500
50500
50000

Como usamos una palabra clave distinta en la consulta, el salario duplicado se eliminará. Se mostrará un salario único como resultado de la consulta interna.

Paso 2: Como el servidor ha terminado con una consulta interna, estamos ejecutando la consulta externa de la consulta anidada en el resultado que obtuvimos de la consulta interna

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

SELECCIONE MIN(salario) DESDE (salida de consulta interna):seleccione el salario mínimo de la salida de consulta interna, que es 50000 y 50000 no es el segundo salario más alto, por lo que hemos usado número de fila <3, lo que dará la cantidad de filas desde arriba que son menos de 3 significan solo 2.

La salida de WHERE número de fila <3:

Salario
65500
60500

Paso 3: La última parte de la consulta, que es SELECT MIN(salary) from (la salida de WHERE rownum<3):

El resultado final de la consulta:

Salario
60500

60500 es el segundo salario más alto en la tabla de empleados.

Nésimo salario más alto usando la función Rank Rank ()

Ejemplo:

SELECT * FROM(SELECT First_Name, salary, dense_rank()      OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =&num;

- Para calcular el tercer salario más alto, use num =3

- Para calcular el segundo salario más alto, use num =2

Iremos por num =2.

El resultado final:

Nombre Salario Clasificación
Rajesh 60500 2

O salida de la consulta interna:

SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees

La función Dense_rank() calcula el Rango de cada fila en un grupo ordenado de filas en orden ascendente y devuelve el Rango como un número. El rango comienza desde 1 y así sucesivamente.

En caso de que dos o más filas tengan el mismo salario, asigna igual rango a todas las filas.

Resultado de la consulta interna:

Nombre Salario Clasificación
VAIBHAVI 65500 1
BHAVESH 65500 1
RAJESH 60500 2
VAIBHAV 60000 3
RUCHIKA 60000 3
DEEPAM 58500 4
PRACHI 55500 5
PRANOTI 55500 5
ARCHIT 55500 5
ASHWINI 54500 6
NIKHIL 50500 7
ANUJA 50500 7
RUCHIKA 50000 8

En la salida, podemos ver la misma clasificación para duplicar el salario.

Paso 2: Como el servidor ha terminado con una consulta interna, estamos ejecutando la consulta externa de la consulta anidada en el resultado que obtuvimos de la consulta interna

SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = &num;

Select * from seleccionará todas las filas que no sean el segundo salario más alto porque hemos usado RankRank donde num =2 dará filas coincidentes según el valor ingresado por el usuario para num.

Como usamos num =2, la salida será

Nombre Salario Clasificación
RAJESH 60500 2
  • Para encontrar el tercer conjunto de salarios num =3,
  • Para encontrar el cuarto conjunto de salarios num =4, y así sucesivamente.