Das geht am besten mit analytischen Funktionen, RANK() oder 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() komprimiert die Lücken bei Gleichstand:
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>
Welches Verhalten Sie bevorzugen, hängt von Ihren Geschäftsanforderungen ab.
Es gibt auch die Analysefunktion ROW_NUMBER(), mit der wir eine genaue Anzahl von Zeilen zurückgeben können. Wir sollten jedoch die Verwendung von Lösungen auf der Grundlage der Zeilennummer vermeiden, es sei denn, die Geschäftslogik kürzt die Ergebnismenge im Falle eines Gleichstands willkürlich ab. Es gibt einen Unterschied, ob Sie nach den fünf höchsten Werten fragen und die ersten fünf Datensätze sortiert nach hohen Werten
Es gibt auch eine nicht-analytische Lösung, die die ROWNUM-Pseudospalte verwendet. Dies ist umständlich, da ROWNUM vor der ORDER BY-Klausel angewendet wird, was zu unerwarteten Ergebnissen führen kann. Es gibt selten einen Grund, ROWNUM anstelle von ROW_NUMBER() oder einer der Ranking-Funktionen zu verwenden.