Начинът да направите това е с аналитичните функции на Oracle. Вашият конкретен сценарий е само вариант на решението, което предоставих в друга тема.
Ако се интересувате просто да изберете втората най-висока заплата, тогава някой от DENSE_RANK(), RANK() и ROW_NUMBER() ще свърши работа:
SQL> select * from
2 ( select sal
3 , rank() over (order by sal desc) as rnk
4 from
5 ( select distinct sal
6 from emp )
7 )
8 where rnk = 2
9 /
SAL RNK
---------- ----------
3000 2
SQL>
Ако обаче искате да изберете допълнителна информация, като например името на служителя с втората най-висока заплата, избраната от вас функция ще повлияе на резултата. Основната причина да изберете един пред друг е това, което се случва, когато има равенство.
Ако използвате ROW_NUMBER(), той ще върне втория служител, подреден по заплата:ами ако има двама служители, които се обвързват за най-високата заплата? Ами ако има двама служители, които се обвързват за втората най-висока заплата? Имайки предвид, че ако използвате RANK() и има двама служители, които се обвързват за първа най-висока заплата, няма не записи с RANK =2.
Предлагам DENSE_RANK() е обикновено най-сигурната функция за избор в тези случаи, но тя наистина зависи от конкретното бизнес изискване.