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:
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:
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.
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 =#
- 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.
SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = #
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.