Sättet att göra detta är med Oracles analytiska funktioner. Ditt specifika scenario är bara en variant av lösningen som jag gav i en annan tråd.
Om du är intresserad av att bara välja den näst högsta lönen kommer någon av DENSE_RANK(), RANK() och ROW_NUMBER() att göra susen:
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>
Men om du vill välja ytterligare information, såsom namnet på den anställde med näst högsta lön, kommer den funktion du väljer att påverka resultatet. Den främsta anledningen till att välja en framför en annan är vad som händer när det är oavgjort.
Om du använder ROW_NUMBER() kommer det att returnera den andra anställde sorterad efter lön:vad händer om det finns två anställda som binder för den högsta lönen? Vad händer om det finns två anställda som binder för den näst högsta lönen? Om du använder RANK() och det finns två anställda som binder för första högsta lönen, kommer det att finnas nej poster med RANK =2.
Jag föreslår att DENSE_RANK() är den vanligtvis säkraste funktionen att välja i dessa fall, men det beror verkligen på det specifika affärskravet.