RANK und DENSE_RANK wurden bereits vorgeschlagen - je nach Ihren Anforderungen können Sie auch ROW_NUMBER():
in Betracht ziehenselect * from (
select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;
Der Unterschied zwischen RANK(), DENSE_RANK() und ROW_NUMBER() läuft auf Folgendes hinaus:
- ROW_NUMBER() generiert immer ein eindeutiges Ranking; Wenn die ORDER BY-Klausel nicht zwischen zwei Zeilen unterscheiden kann, gibt sie ihnen trotzdem unterschiedliche Rangordnungen (zufällig)
- RANK() und DENSE_RANK() geben Zeilen, die nicht durch die ORDER BY-Klausel unterschieden werden können, dieselbe Rangfolge
- DENSE_RANK() erzeugt immer eine fortlaufende Folge von Rängen (1,2,3,...), wohingegen RANK() nach zwei oder mehr Reihen mit demselben Rang Lücken hinterlässt (denken Sie an "Olympische Spiele":if zwei Athleten gewinnen die Goldmedaille, es gibt keinen zweiten Platz, sondern nur einen dritten)
Wenn Sie also nur einen Mitarbeiter wollen (auch wenn es mehrere mit dem zweithöchsten Gehalt gibt), würde ich ROW_NUMBER() empfehlen.