RANK i DENSE_RANK zostały już zasugerowane - w zależności od wymagań możesz również rozważyć ROW_NUMBER():
select * from (
select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;
Różnica między RANK(), DENSE_RANK() i ROW_NUMBER() sprowadza się do:
- ROW_NUMBER() zawsze generuje unikalny ranking; jeśli klauzula ORDER BY nie może odróżnić dwóch wierszy, nadal da im różne rankingi (losowo)
- RANK() i DENSE_RANK() dadzą ten sam ranking wierszom, których nie można rozróżnić za pomocą klauzuli ORDER BY
- DENSE_RANK() zawsze wygeneruje ciągłą sekwencję rang (1,2,3,...), podczas gdy RANK() pozostawi luki po dwóch lub więcej wierszach o tej samej randze (pomyśl "Igrzyska Olimpijskie":jeśli dwóch zawodników zdobywa złoty medal, drugiego miejsca nie ma, tylko trzecie)
Tak więc, jeśli chcesz tylko jednego pracownika (nawet jeśli jest kilku z drugą najwyższą pensją), polecam ROW_NUMBER().