Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да намерим служителя с втората най-висока заплата?

Начинът да направите това е с аналитичните функции на Oracle. Вашият конкретен сценарий е само вариант на решението, което предоставих в друга тема.

Ако се интересувате просто да изберете втората най-висока заплата, тогава някой от DENSE_RANK(), RANK() и 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> 

Ако обаче искате да изберете допълнителна информация, като например името на служителя с втората най-висока заплата, избраната от вас функция ще повлияе на резултата. Основната причина да изберете един пред друг е това, което се случва, когато има равенство.

Ако използвате ROW_NUMBER(), той ще върне втория служител, подреден по заплата:ами ако има двама служители, които се обвързват за най-високата заплата? Ами ако има двама служители, които се обвързват за втората най-висока заплата? Имайки предвид, че ако използвате RANK() и има двама служители, които се обвързват за първа най-висока заплата, няма не записи с RANK =2.

Предлагам DENSE_RANK() е обикновено най-сигурната функция за избор в тези случаи, но тя наистина зависи от конкретното бизнес изискване.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция TRANSLATE() в Oracle

  2. Pivot на Oracle 10g

  3. Използване на Oracle JDeveloper 12c с Oracle Database 12c на Oracle Cloud Platform, част 1

  4. Екраниране на контролни знаци в Oracle XDB

  5. Колко индекса на базата данни са твърде много?