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().