Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como posso selecionar o registro com o 2º maior salário no banco de dados Oracle?


RANK e DENSE_RANK já foram sugeridos - dependendo de seus requisitos, você também pode considerar ROW_NUMBER():
select * from (
  select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;

A diferença entre RANK(), DENSE_RANK() e ROW_NUMBER() se resume a:
  • ROW_NUMBER() sempre gera uma classificação única; se a cláusula ORDER BY não puder distinguir entre duas linhas, ela ainda dará a elas classificações diferentes (aleatoriamente)
  • RANK() e DENSE_RANK() darão a mesma classificação para linhas que não podem ser distinguidas pela cláusula ORDER BY
  • DENSE_RANK() sempre gerará uma sequência contígua de classificações (1,2,3,...), enquanto RANK() deixará lacunas após duas ou mais linhas com a mesma classificação (pense em "Jogos Olímpicos":se dois atletas ganham a medalha de ouro, não há segundo lugar, apenas terceiro)

Portanto, se você quiser apenas um funcionário (mesmo que haja vários com o segundo salário mais alto), recomendo ROW_NUMBER().