Cómo encontrar el enésimo salario más alto de una tabla

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: 

  1. 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.
  2. Esta función acepta argumentos como cualquier tipo de datos numéricos y devuelve NÚMERO.
  3. 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.
  4. 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: 

  1. Encuentre los empleados con los N mejores salarios distintos.
  2. Encuentre el salario más bajo entre los salarios obtenidos por la consulta anterior, esto nos dará el N-ésimo salario más alto.
  3. 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

Categories SQL

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *