45. Найти сотрудников с максимальной зарплатой в каждом департаменте
Условие задачи:
Даны таблицы departments и employees.
Необходимо для каждого департамента вывести сотрудников, получающих максимальную зарплату в своём департаменте:
название департамента;
имя сотрудника;
зарплату.
Если несколько сотрудников получают одинаковую максимальную зарплату, нужно вывести их всех.
Код:
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT REFERENCES departments(id),
salary NUMERIC(10, 2)
);
Спойлеры к решению
Подсказки
💡 Используй оконную функцию
💡 Раздели сотрудников по
💡 Внутри каждого департамента отсортируй сотрудников по
💡 Сотрудники с максимальной зарплатой получат ранг
RANK() или DENSE_RANK().💡 Раздели сотрудников по
department_id через PARTITION BY.💡 Внутри каждого департамента отсортируй сотрудников по
salary DESC.💡 Сотрудники с максимальной зарплатой получат ранг
1.Решение
Вариант через оконную функцию:
WITH ranked_employees AS (
SELECT
d.name AS department,
e.name AS employee,
e.salary,
RANK() OVER (
PARTITION BY e.department_id
ORDER BY e.salary DESC
) AS salary_rank
FROM employees e
JOIN departments d
ON d.id = e.department_id
)
SELECT
department,
employee,
salary
FROM ranked_employees
WHERE salary_rank = 1
ORDER BY department, employee;
Оконная функция:
RANK() OVER (
PARTITION BY e.department_id
ORDER BY e.salary DESC
)
отдельно ранжирует сотрудников внутри каждого департамента.
Сотрудники с максимальной зарплатой получают ранг 1.
Например:
department | employee | salary
-----------+----------+-------
IT | Alex | 200000
IT | Ivan | 200000
HR | Anna | 150000
Если в одном департаменте несколько сотрудников имеют одинаковую максимальную зарплату, RANK() вернёт всех таких сотрудников.