73. Найти сотрудников с максимальной зарплатой в каждом отделе
Условие задачи:
Даны таблицы Department и Employee.
Необходимо вывести id и name сотрудников, которые получают максимальную зарплату в своём отделе.
Если несколько сотрудников в одном отделе получают одинаковую максимальную зарплату, нужно вывести их всех.
Код:
Department
-----------------
id
name
Employee
-----------------
id
department_id
name
salary
Связь между таблицами:
Employee.department_id → Department.id
Спойлеры к решению
Подсказки
department_id.💡 Удобно использовать оконную функцию
MAX() OVER (PARTITION BY ...).💡 Затем сравни зарплату сотрудника с максимальной зарплатой его отдела.
💡 Таблица
Department не требуется, поскольку нужно вывести только данные сотрудников.Решение
Вариант через оконную функцию:
SELECT
id,
name
FROM (
SELECT
id,
name,
salary,
MAX(salary) OVER (
PARTITION BY department_id
) AS max_salary
FROM Employee
) e
WHERE salary = max_salary;
Выражение:
MAX(salary) OVER (
PARTITION BY department_id
)
вычисляет максимальную зарплату отдельно внутри каждого отдела, не объединяя строки сотрудников.
После этого условие:
WHERE salary = max_salary
оставляет только сотрудников, чья зарплата равна максимальной зарплате их отдела.
Если максимальную зарплату получают несколько сотрудников, запрос вернёт их всех.
Альтернативный вариант через коррелированный подзапрос:
SELECT
e.id,
e.name
FROM Employee e
WHERE e.salary = (
SELECT MAX(e2.salary)
FROM Employee e2
WHERE e2.department_id = e.department_id
);
В обоих вариантах таблица Department не нужна, поскольку department_id уже хранится в Employee, а название отдела выводить не требуется.