sql >> Database >  >> RDS >> Oracle

Selecteer TOP N en BOTTOM N

De beste manier om dit probleem op te lossen, hangt gedeeltelijk af van uw Oracle-versie. Hier is een zeer eenvoudige (en, naar ik vermoed, zeer efficiënte) oplossing met behulp van de match_recognize clausule, toegevoegd in versie 12.1.

Ik illustreer het met behulp van de EMPLOYEES tabel in de standaard HR schema, bestellen op SALARY . De enige truc hier is om de bovenste en onderste vijf rijen te selecteren en alles daartussenin te negeren; dat (het "negeren") is wat de {- ... -} operator doet in het pattern bijzin.

select employee_id, first_name, last_name, salary
from   hr.employees
match_recognize(
  order by salary desc
  all rows per match
  pattern ( a{5} {- a* -} a{5} )
  define a as 0 = 0             -- For reasons known only to Oracle, DEFINE is required.
);

EMPLOYEE_ID FIRST_NAME           LAST_NAME                     SALARY
----------- -------------------- ------------------------- ----------
        100 Steven               King                           24000
        101 Neena                Kochhar                        17000
        102 Lex                  De Haan                        17000
        145 John                 Russell                        14000
        146 Karen                Partners                       13500
        135 Ki                   Gee                             2400
        127 James                Landry                          2400
        136 Hazel                Philtanker                      2200
        128 Steven               Markle                          2200
        132 TJ                   Olson                           2100


  1. SQL Server berekende kolom selecteren uit een andere tabel

  2. Verbind tomcat en mysql in docker-compose

  3. Fout met mysql-procedures ERROR 1304 &ERROR 1305

  4. Django - null-waarde in kolom schendt niet-null-beperking in Django Admin