Сотрудник с максимальной зарплатой в каждом департаменте

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() вернёт всех таких сотрудников.