RANK e DENSE_RANK sono già stati suggeriti - a seconda delle tue esigenze, potresti anche considerare ROW_NUMBER():
select * from (
select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;
La differenza tra RANK(), DENSE_RANK() e ROW_NUMBER() si riduce a:
- ROW_NUMBER() genera sempre una classifica univoca; se la clausola ORDER BY non riesce a distinguere tra due righe, attribuirà loro comunque graduatorie diverse (a caso)
- RANK() e DENSE_RANK() daranno la stessa classifica alle righe che non possono essere distinte dalla clausola ORDER BY
- DENSE_RANK() genererà sempre una sequenza contigua di ranghi (1,2,3,...), mentre RANK() lascerà spazi vuoti dopo due o più righe con lo stesso rango (pensa a "Giochi Olimpici":se due atleti vincono la medaglia d'oro, non c'è il secondo posto, solo il terzo)
Quindi, se vuoi un solo dipendente (anche se ce ne sono diversi con il secondo stipendio più alto), ti consiglio ROW_NUMBER().