MiddleКодИногдаЕщё не отвечали
Напишите запрос для N-й по величине зарплаты с одинаковыми
Верните N-ю по величине зарплату, считая равные зарплаты одним рангом.
-- Employee(id, name, salary, dept_id, manager_id)
-- параметр :N — нужный ранг
-- напишите ваш запрос здесь
Напишите запрос.
Проранжируйте зарплаты оконной функцией и отфильтруйте по рангу: SELECT salary FROM (SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk FROM Employee) t WHERE rnk = :N. DENSE_RANK даёт равным зарплатам одинаковый ранг без пропусков в нумерации.
- ✗Использовать
ROW_NUMBER, где равные должны делить ранг (нуженDENSE_RANK) - ✗Полагаться на
OFFSETбезDISTINCT, из-за чего равенства сдвигают позицию - ✗Путать
RANK(с пропусками) иDENSE_RANK(без пропусков)
- →Когда для этой задачи выбрать
RANK, а неDENSE_RANK? - →Чем
ROW_NUMBERведёт себя иначе, чемDENSE_RANK, при равных зарплатах?
Оглавление
Задача
Верните N-ю по величине зарплату из Employee, считая равные зарплаты одним рангом.
Решение
SELECT salary
FROM (
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM Employee
) t
WHERE rnk = :N;
Ключевые моменты
DENSE_RANKприсваивает равным зарплатам один ранг и не оставляет пропусков в нумерации.ROW_NUMBERдал бы каждой строке уникальный номер — не годится, когда равные должны делить ранг.RANKтоже делит ранг при равенстве, но пропускает следующие номера.
Оглавление