Nejlepší způsob, jak toho dosáhnout, je pomocí analytických funkcí, RANK() nebo DENSE_RANK() ...
SQL> select * from (
2 select empno
3 , sal
4 , rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7 /
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 4
8083 2850 5
7698 2850 5
6 rows selected.
SQL>
DENSE_RANK() komprimuje mezery, když je shoda:
SQL> select * from (
2 select empno
3 , sal
4 , dense_rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7 /
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 3
8083 2850 4
7698 2850 4
8070 2500 5
7 rows selected.
SQL>
Jaké chování preferujete, závisí na vašich obchodních požadavcích.
Existuje také analytická funkce ROW_NUMBER(), kterou můžeme použít k vrácení přesného počtu řádků. Měli bychom se však vyvarovat používání řešení založených na čísle řádku, pokud obchodní logika nechce libovolně zkrátit sadu výsledků v případě nerozhodného výsledku. Je rozdíl požadovat pět nejvyšších hodnot a prvních pět záznamů seřazených podle vysokých hodnot
Existuje také neanalytické řešení využívající pseudosloupec ROWNUM. To je neohrabané, protože ROWNUM je použito před klauzulí ORDER BY, což může vést k neočekávaným výsledkům. Málokdy existuje důvod používat ROWNUM místo ROW_NUMBER() nebo některou z hodnotících funkcí.