sql >> Database >  >> RDS >> Oracle

Hoe kan ik het record met het 2e hoogste salaris selecteren in database Oracle?

RANK en DENSE_RANK zijn al voorgesteld - afhankelijk van uw vereisten kunt u ook ROW_NUMBER():

overwegen
select * from (
  select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;

Het verschil tussen RANK(), DENSE_RANK() en ROW_NUMBER() komt neer op:

  • ROW_NUMBER() genereert altijd een unieke ranking; als de ORDER BY-clausule geen onderscheid kan maken tussen twee rijen, geeft het ze nog steeds een verschillende rangorde (willekeurig)
  • RANK() en DENSE_RANK() geven dezelfde rangorde aan rijen die niet kunnen worden onderscheiden door de ORDER BY-clausule
  • DENSE_RANK() zal altijd een aaneengesloten reeks rangschikkingen genereren (1,2,3,...), terwijl RANK() gaten laat na twee of meer rijen met dezelfde rangorde (denk aan "Olympische Spelen":als twee atleten winnen de gouden medaille, er is geen tweede plaats, alleen derde)

Dus als u slechts één werknemer wilt (zelfs als er meerdere zijn met het op één na hoogste salaris), raad ik ROW_NUMBER() aan.



  1. Waarom maakt MySQL een volledige scan als ik deelneem aan een zeer kleine/lege tabel, ondanks dat ik LIMIT gebruik?

  2. Oracle DBMS - Lees een tabel voor verwerking Updaten in een AFTER-trigger - tabel muteren

  3. Rails 3 migraties:boolean (mysql vs postgreSQL)

  4. Tel gegroepeerde hiaten in de tijd voor tijdsbereik