sql >> Databáze >  >> RDS >> Oracle

Jak najít zaměstnance s druhým nejvyšším platem?

Způsob, jak toho dosáhnout, je pomocí analytických funkcí Oracle. Váš konkrétní scénář je pouze variantou řešení, které jsem uvedl v jiném vláknu.

Pokud máte zájem o výběr pouze druhého nejvyššího platu, pak bude stačit kterýkoli z DENSE_RANK(), RANK() a ROW_NUMBER():

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> 

Pokud však chcete vybrat doplňující informace, jako je jméno zaměstnance s druhým nejvyšším platem, ovlivní výsledek zvolená funkce. Hlavním důvodem pro výběr jednoho před druhým je to, co se stane, když dojde k remíze.

Pokud použijete ROW_NUMBER(), vrátí druhého zaměstnance seřazeného podle platu:co když jsou dva zaměstnanci shodně o nejvyšší plat? Co když jsou dva zaměstnanci svázaní o druhý nejvyšší plat? Pokud použijete RANK() a jsou zde dva zaměstnanci, kteří mají první nejvyšší plat, nebude ne záznamy s RANK =2.

Doporučuji DENSE_RANK() je obvykle nejbezpečnější funkce pro výběr v těchto případech, ale to opravdu závisí na konkrétním obchodním požadavku.



  1. Vydělávejte peníze nevyužitými věcmi:Sdílený ekonomický datový model

  2. 12c Změny DBA_USERS

  3. Pořadí provádění podmínek v klauzuli SQL 'where'

  4. Levenshtein:MySQL + PHP