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().