Oracle
 sql >> Database >  >> RDS >> Oracle

Come trovare il dipendente con il secondo stipendio più alto?

Il modo per farlo è con le funzioni analitiche di Oracle. Il tuo scenario particolare è solo una variante della soluzione che ho fornito in un altro thread.

Se sei interessato solo a selezionare il secondo stipendio più alto, uno qualsiasi tra DENSE_RANK(), RANK() e ROW_NUMBER() farà il trucco:

SQL> select * from
  2   ( select sal
  3            , rank() over (order by sal desc) as rnk
  4     from
  5      ( select distinct sal
  6        from emp )
  7    )
  8  where rnk = 2
  9  /

       SAL        RNK
---------- ----------
      3000          2

SQL> 

Tuttavia, se desideri selezionare informazioni aggiuntive, come il nome del dipendente con il secondo stipendio più alto, la funzione scelta influirà sul risultato. Il motivo principale per scegliere l'uno rispetto all'altro è cosa succede quando c'è un pareggio.

Se usi ROW_NUMBER() restituirà il secondo dipendente ordinato per stipendio:cosa succede se ci sono due dipendenti che pareggiano per lo stipendio più alto? Cosa succede se ci sono due dipendenti che pareggiano per il secondo stipendio più alto? Considerando che se usi RANK() e ci sono due dipendenti che pareggiano per il primo stipendio più alto, non ci sarà no record con RANK =2.

Suggerisco DENSE_RANK() è solitamente la funzione più sicura da scegliere in questi casi, ma dipende davvero dal requisito aziendale specifico.