Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle SQL - Abrufen der höchsten 5 Werte einer Spalte

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.