RANK a DENSE_RANK již byly navrženy – v závislosti na vašich požadavcích můžete zvážit také ROW_NUMBER():
select * from (
select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;
Rozdíl mezi RANK(), DENSE_RANK() a ROW_NUMBER() se scvrkává na:
- ROW_NUMBER() vždy generuje jedinečné hodnocení; pokud klauzule ORDER BY nedokáže rozlišit mezi dvěma řádky, bude jim stále přidělovat různé pořadí (náhodně)
- RANK() a DENSE_RANK() poskytnou stejné hodnocení řádkům, které nelze odlišit klauzulí ORDER BY
- DENSE_RANK() vždy vygeneruje souvislou posloupnost hodnocení (1,2,3,...), zatímco RANK() ponechá mezery po dvou nebo více řádcích se stejnou pozicí (například „olympijské hry“:pokud dva sportovci získávají zlatou medaili, druhé místo není, pouze třetí)
Pokud tedy chcete pouze jednoho zaměstnance (i když jich je několik s 2. nejvyšším platem), doporučil bych ROW_NUMBER().