RANK и DENSE_RANK вече са предложени - в зависимост от вашите изисквания може също да обмислите ROW_NUMBER():
select * from (
select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;
Разликата между RANK(), DENSE_RANK() и ROW_NUMBER() се свежда до:
- ROW_NUMBER() винаги генерира уникално класиране; ако клаузата ORDER BY не може да направи разлика между два реда, тя пак ще им даде различно класиране (на случаен принцип)
- RANK() и DENSE_RANK() ще дадат еднакво класиране на редове, които не могат да бъдат разграничени от клаузата ORDER BY
- DENSE_RANK() винаги ще генерира непрекъсната последователност от рангове (1,2,3,...), докато RANK() ще остави празнини след два или повече реда с еднакъв ранг (помислете за „Олимпийски игри“:ако двама спортисти печелят златния медал, няма второ място, само трето)
Така че, ако искате само един служител (дори ако има няколко с 2-ра най-висока заплата), бих препоръчал ROW_NUMBER().