Как найти сотрудника со второй по величине зарплатой? - PullRequest
4 голосов
/ 22 марта 2010

Существует ли какая-либо предопределенная функция или метод для получения второй по величине зарплаты из таблицы сотрудников?

Ответы [ 4 ]

5 голосов
/ 22 марта 2010

Способ сделать это с помощью аналитических функций 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 (), как правило, самая безопасная функция для выбора в этих случаях, но она действительно зависит от конкретных бизнес-требований.

2 голосов
/ 22 марта 2010

В Oracle вы бы использовали такой запрос, чтобы вернуть постраничные результаты (строки от M до N):

SELECT NAME, salary
  FROM (SELECT NAME, salary, ROWNUM r 
          FROM (SELECT NAME, salary 
                  FROM employee 
                 ORDER BY salary DESC
                )
         WHERE ROWNUM <= :N
        )
 WHERE r >= :M

Также вы можете использовать аналитику:

SELECT NAME, salary
  FROM (SELECT NAME, salary, row_number() over (ORDER BY salary DESC) n 
          FROM employee)
 WHERE n BETWEEN :M AND :N
1 голос
/ 01 января 2011

Если вы хотите найти n самых высоких зарплат из таблицы, вы можете использовать это:

select min(sal)from (select distinct sal from emp order by sal desc) where rownum<=n;

, где n равно 1,2,3, ..., n

Это очень простой процесс, чтобы узнать максимальную зарплату из таблицы.

0 голосов
/ 22 марта 2010

Попробуйте это:

SELECT * FROM employee emp WHERE 2=(SELECT COUNT(*) FROM employee WHERE
salary >= emp.salary);
...