sql >> Databasteknik >  >> RDS >> Oracle

Använd TOP eller Rank när du hittar de första eller de flesta observationerna

För att få de första 100 personerna anställda i företaget

Först av allt, var försiktig med att slipsfallen ingår i resultaten av båda frågorna nedan. t.ex. även om du har anställda med samma anställningsdatum, finns de med i listorna, vilket innebär att listorna har minst 100 personer.

Om din databasversion är 12c- , då måste du använda en underfråga för att returnera resultatet av dense_rank() funktion :

select department_name, department_id, first_name, hire_date, salary
  from
  (
   select d.department_name, d.department_id, e.first_name, e.hire_date, e.salary,
          dense_rank() over ( order by hire_date ) as e_rank_hire
     from Dtable_department d 
     join Etable_employee e
       on e.department_id = d.department_id
  )
 where e_rank_hire <= 100 
 order by e_rank_hire;

Om din databasversion är 12c+ , då behöver du inte använda en underfråga för fetchs skull klausul:

select d.department_name, d.department_id, e.first_name, e.hire_date, e.salary
  from Dtable_department d 
  join Etable_employee e
    on e.department_id = d.department_id
order by hire_date
fetch first 100 rows with ties;

Var uppmärksam på ditt fall att använda partition by satsen är fel och bör tas bort inom dense_rank() funktions uttryck och ordning på anställningsdatum bör inte vara fallande utan stigande.

Demo för topp 10 anställda




  1. Hur skriver jag om den här MySQL-frågan så att den inte ger det här felet:Du kan inte ange måltabellen 'crawlLog' för uppdatering i FROM-satsen?

  2. Hitta alla medförfattare - Fasettering/gruppering för många till många kartläggningstabeller

  3. Hur man stoppar denna upprepning och grupperar efter datum

  4. Beställ tabell efter närhet till specifik latitud/longitud (med MySQL+PHP)