Způsob, jak toho dosáhnout, je pomocí analytických funkcí Oracle. Váš konkrétní scénář je pouze variantou řešení, které jsem uvedl v jiném vláknu.
Pokud máte zájem o výběr pouze druhého nejvyššího platu, pak bude stačit kterýkoli z DENSE_RANK(), RANK() a 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>
Pokud však chcete vybrat doplňující informace, jako je jméno zaměstnance s druhým nejvyšším platem, ovlivní výsledek zvolená funkce. Hlavním důvodem pro výběr jednoho před druhým je to, co se stane, když dojde k remíze.
Pokud použijete ROW_NUMBER(), vrátí druhého zaměstnance seřazeného podle platu:co když jsou dva zaměstnanci shodně o nejvyšší plat? Co když jsou dva zaměstnanci svázaní o druhý nejvyšší plat? Pokud použijete RANK() a jsou zde dva zaměstnanci, kteří mají první nejvyšší plat, nebude ne záznamy s RANK =2.
Doporučuji DENSE_RANK() je obvykle nejbezpečnější funkce pro výběr v těchto případech, ale to opravdu závisí na konkrétním obchodním požadavku.