sql >> Databasteknik >  >> RDS >> Oracle

Hur kan jag välja posten med den 2:a högsta lönen i databasen Oracle?

RANK och DENSE_RANK har redan föreslagits – beroende på dina krav kan du också överväga ROW_NUMBER():

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

Skillnaden mellan RANK(), DENSE_RANK() och ROW_NUMBER() kokar ner till:

  • ROW_NUMBER() genererar alltid en unik rankning; om ORDER BY-satsen inte kan skilja mellan två rader, kommer den fortfarande att ge dem olika rankningar (slumpmässigt)
  • RANK() och DENSE_RANK() ger samma rankning till rader som inte kan särskiljas av ORDER BY-satsen
  • DENSE_RANK() kommer alltid att generera en sammanhängande sekvens av rangordningar (1,2,3,...), medan RANK() kommer att lämna luckor efter två eller flera rader med samma rang (tänk "Olympiska spelen":om två idrottare vinner guldmedaljen, det finns ingen andra plats, bara trea)

Så om du bara vill ha en anställd (även om det finns flera med den 2:a högsta lönen), skulle jag rekommendera ROW_NUMBER().



  1. Mysql infoga slumpmässig datumtid i ett givet datumintervall

  2. Hur hittar man alla relationer mellan alla mysql-tabeller?

  3. VÄLJ * FRÅN personer WHERE user_id='$user_id' ORDNING EFTER tid GRUPPER EFTER efternamn

  4. Hur genererar man en UUIDv4 i MySQL?