sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo puedo seleccionar el registro con el segundo salario más alto en la base de datos Oracle?

Ya se han sugerido RANK y DENSE_RANK; según sus requisitos, también puede considerar ROW_NUMBER():

select * from (
  select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;

La diferencia entre RANK(), DENSE_RANK() y ROW_NUMBER() se reduce a:

  • ROW_NUMBER() siempre genera una clasificación única; si la cláusula ORDER BY no puede distinguir entre dos filas, igual les otorgará clasificaciones diferentes (al azar)
  • RANK() y DENSE_RANK() otorgarán la misma clasificación a las filas que no se pueden distinguir mediante la cláusula ORDER BY
  • DENSE_RANK() siempre generará una secuencia contigua de rangos (1,2,3,...), mientras que RANK() dejará espacios después de dos o más filas con el mismo rango (piense en "Juegos Olímpicos":si dos atletas ganan la medalla de oro, no hay un segundo lugar, solo un tercero)

Entonces, si solo desea un empleado (incluso si hay varios con el segundo salario más alto), le recomendaría ROW_NUMBER().