RANK og DENSE_RANK er allerede blevet foreslået - afhængigt af dine krav kan du også overveje ROW_NUMBER():
select * from (
select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;
Forskellen mellem RANK(), DENSE_RANK() og ROW_NUMBER() kan koges ned til:
- ROW_NUMBER() genererer altid en unik rangering; hvis ORDER BY-sætningen ikke kan skelne mellem to rækker, vil den stadig give dem forskellige rangeringer (tilfældigt)
- RANK() og DENSE_RANK() vil give den samme rangering til rækker, der ikke kan skelnes af ORDER BY-sætningen
- DENSE_RANK() vil altid generere en sammenhængende rækkefølge (1,2,3,...), hvorimod RANK() vil efterlade huller efter to eller flere rækker med samme rang (tænk "Olympic Games":hvis to atleter vinder guldmedaljen, der er ingen andenplads, kun tredje)
Så hvis du kun vil have én medarbejder (selvom der er flere med den 2. højeste løn), vil jeg anbefale ROW_NUMBER().