Encontrar el enésimo salario más alto en una tabla es la pregunta más común en las entrevistas. Aquí hay una forma de hacer esta tarea usando la función dense_rank().
Considere la siguiente tabla:
Empleado
esmalte | sal |
---|---|
A | 23000 |
B | 31000 |
C | 24500 |
D | 35000 |
mi | 28500 |
F | 31500 |
GRAMO | 39800 |
H | 51000 |
yo | 39800 |
Consulta :
select * from( select ename, sal, dense_rank() over(order by sal desc)r from Employee) where r=&n; To find to the 2nd highest sal set n = 2 To find 3rd highest sal set n = 3 and so on.
Producción :
DENSO_RANGO:
- DENSE_RANK calcula el rango de una fila en un grupo ordenado de filas y devuelve el rango como NÚMERO. Los rangos son enteros consecutivos que comienzan con 1.
- Esta función acepta argumentos como cualquier tipo de datos numéricos y devuelve NÚMERO.
- Como función analítica, DENSE_RANK calcula el rango de cada fila devuelta de una consulta con respecto a las otras filas, en función de los valores de value_exprs en order_by_clause.
- En la consulta anterior, el rango se devuelve según la sal de la tabla de empleados. En caso de empate, asigna igual rango a todas las filas.
Solución alternativa:
———————————————————————————————————————————————— ——————————————————————–
CREATE TABLE `Employee` ( `ENAME` varchar(225) COLLATE utf8_unicode_ci NOT NULL, `SAL` bigint(20) unsigned NOT NULL, PRIMARY KEY (`ENAME`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
———————————————————————————————————————————————————— ——-
6th highest mysql> select * from ((select * from Employee ORDER BY `sal` DESC limit 6 ) AS T) ORDER BY T.`sal` ASC limit 1; Alternate use of Limit: select * from Employee ORDER BY `sal` ASC limit 5,1; // will return 6th highest +-------+-----+ | ENAME | SAL | +-------+-----+ | B | 300 | +-------+-----+ 1 row in set (0.00 sec)
———————————————————————————————————————————————————— –
mysql> select * from Employee; +-------+-----+ | ENAME | SAL | +-------+-----+ | A | 100 | | B | 300 | | C | 200 | | D | 500 | | F | 400 | | G | 600 | | H | 700 | | I | 800 | +-------+-----+ 8 rows in set (0.00 sec)
Gracias a Vijay por sugerir esta solución alternativa.
Solución alternativa:
suponga que la tarea es encontrar al empleado con el enésimo salario más alto de la tabla anterior. Podemos hacer esto de la siguiente manera:
- Encuentre los empleados con los N mejores salarios distintos.
- Encuentre el salario más bajo entre los salarios obtenidos por la consulta anterior, esto nos dará el N-ésimo salario más alto.
- Encuentre los detalles del empleado cuyo salario es el salario más bajo obtenido por la consulta anterior.
Consulta :
SELECT * FROM Employee WHERE sal = ( SELECT MIN(sal) FROM Employee WHERE sal IN ( SELECT DISTINCT TOP N sal FROM Employee ORDER BY sal DESC ) )
La consulta anterior obtendrá los detalles del empleado con el N-ésimo salario más alto. Veamos cómo:
- Considere N = 4.
- Comenzando con la consulta más interna, la consulta: » SELECCIONE DISTINCT TOP 4 sal FROM Employee ORDER BY sal DESC » producirá el siguiente resultado:
51000 39800 35000 31500
- La siguiente consulta externa es: » SELECT MIN(sal) FROM Employee WHERE sal IN ( Result_Set_of_Previous_Query ) «. Esto devolverá el siguiente resultado:
31500
- Puede ver que el resultado devuelto anterior es el cuarto salario más alto requerido.
- La siguiente es la consulta más externa, que es: » SELECCIONAR * DE Empleado DONDE sal = Result_of_Previous_Query «. Esta consulta devolverá los detalles de los empleados con el cuarto salario más alto.
________________________ ename sal ________________________ F | 31500 | ________________________
Otra solución:
aquí N = enésimo salario más alto, p. 3er Salario más alto: N=3.
SELECT ename,sal from Employee e1 where N-1 = (SELECT COUNT(DISTINCT sal)from Employee e2 where e2.sal > e1.sal)
Solución usando límite:
Select Salary from table_name order by Salary DESC limit n-1,1;
Aquí estamos ordenando nuestro salario en orden descendente, por lo que obtendremos el salario más alto primero y luego los salarios más bajos.
La cláusula de límite tiene dos componentes, el primer componente es omitir el número de filas desde arriba y el segundo componente es mostrar el número de filas que queremos.
veamos con un ejemplo:
Para encontrar el cuarto salario más alto, la consulta será:
Select Salary from table_name order by Salary DESC limit 3,1;
Aquí estamos saltando 3 filas desde la parte superior y regresando solo 1 fila después de saltar.
También puede encontrar los nombres de los empleados que tienen el enésimo salario más alto
Select Emp_name from table_name where Salary =( Select Salary from table_name order by Salary DESC limit n-1,1);
Puede haber otra pregunta como encontrar el enésimo salario más bajo. Para eso, simplemente invierta el orden usando ASC (si no especifica por defecto, la columna se ordenará en orden ascendente).
Select Salary from table_name order by Salary limit n-1,1;
&t=176s
Este artículo es una contribución de Rishav Shandilya . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA