RANK en DENSE_RANK zijn al voorgesteld - afhankelijk van uw vereisten kunt u ook ROW_NUMBER():
overwegenselect * 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.