Вывести сотрудников с максимальной зарплатой в своём отделе

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, а название отдела выводить не требуется.