Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak znaleźć pracownika z drugą najwyższą pensją?

Sposobem na to jest użycie funkcji analitycznych Oracle. Twój konkretny scenariusz jest tylko wariantem rozwiązania, które przedstawiłem w innym wątku.

Jeśli chcesz po prostu wybrać drugą najwyższą pensję, wystarczy dowolny z DENSE_RANK(), RANK() i 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> 

Jeśli jednak chcesz wybrać dodatkowe informacje, takie jak imię i nazwisko pracownika z drugą najwyższą pensją, wybrana przez Ciebie funkcja będzie miała wpływ na wynik. Głównym powodem wyboru jednego z nich jest to, co dzieje się, gdy jest remis.

Jeśli użyjesz ROW_NUMBER(), zwróci drugi pracownik uporządkowany według wynagrodzenia:co, jeśli dwóch pracowników wiąże się z najwyższą pensją? Co się stanie, jeśli dwóch pracowników będzie ubiegać się o drugą najwyższą pensję? Z drugiej strony, jeśli użyjesz RANK() i dwóch pracowników remisuje o pierwszą najwyższą pensję, nie będzie nie rekordy z RANKĄ =2.

Sugeruję, że DENSE_RANK() jest zwykle najbezpieczniejszą funkcją do wyboru w takich przypadkach, ale tak naprawdę zależy to od konkretnych wymagań biznesowych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj z daty na epokę-Oracle

  2. Oracle Database Security:Audyt bazy danych

  3. Wybierz wartość elementu xml w Oracle

  4. Funkcja przechowywana w wywołaniu C# Oracle

  5. EXTRACT (data/godzina) Funkcja w Oracle