La forma de hacerlo es con las funciones analíticas de Oracle. Su escenario particular es solo una variante de la solución que proporcioné en otro hilo.
Si está interesado en seleccionar el segundo salario más alto, cualquiera de DENSE_RANK(), RANK() y ROW_NUMBER() funcionará:
SQL> select * from
2 ( select sal
3 , rank() over (order by sal desc) as rnk
4 from
5 ( select distinct sal
6 from emp )
7 )
8 where rnk = 2
9 /
SAL RNK
---------- ----------
3000 2
SQL>
Sin embargo, si desea seleccionar información adicional, como el nombre del empleado con el segundo salario más alto, la función que elija afectará el resultado. La principal razón para elegir uno sobre otro es lo que sucede cuando hay un empate.
Si usa ROW_NUMBER() devolverá el segundo empleado ordenado por salario:¿qué pasa si hay dos empleados empatados por el salario más alto? ¿Qué pasa si hay dos empleados empatados por el segundo salario más alto? Considerando que si usa RANK() y hay dos empleados empatados por el primer salario más alto, habrá no registros con RANGO =2.
Sugiero que DENSE_RANK() suele ser la función más segura para elegir en estos casos, pero realmente depende del requisito comercial específico.