sql solution.sql

Лучший сотрудник в каждом отделе

Верните ровно одного действующего сотрудника на отдел, корректно разрешив одинаковые оклады.

  • ЯзыкSQL
  • УровеньСредний
  • НавыкОконные функции и top-1 внутри группы

Лучший в каждом отделе

Контекст

Раз в квартал «Пульс» готовит срез для совета директоров: кто в каждом отделе получает больше всех. В отчёте на отдел отводится ровно одна строка — даже если верхний оклад в отделе получают двое.

Задача

Верните по одному сотруднику на отдел — того, у кого самый высокий оклад.

Данные

Таблица departments — отделы:

колонкатипчто хранит
idintномер отдела
titletextназвание
citytextгород

Таблица employees — сотрудники:

колонкатипчто хранит
idintномер сотрудника
nametextимя
department_idintномер отдела
manager_idintномер руководителя, NULL у директора
job_titletextдолжность
salaryintоклад в рублях, NULL если ещё не назначен
hired_atdateдата найма
left_atdateдата ухода, NULL у действующих

Примерные строки employees:

idnamedepartment_idsalaryhired_atleft_at
8Дмитрий Лапин31900002023-07-04NULL
16Егор Тарасов31900002025-06-01NULL
22Слава Дёмин1NULL2026-06-15NULL
23Кирилл Ким14900002023-06-012026-05-31

Правила

  1. Колонки: department (название отдела), employee (имя сотрудника), salary.
  2. Участвуют только действующие сотрудники (left_at IS NULL) с назначенным окладом.
  3. Ровно одна строка на отдел. При равных окладах побеждает нанятый раньше; если равны и даты — тот, у кого меньше id.
  4. Отдел, в котором не осталось подходящих сотрудников, в выдачу не попадает.
  5. Сортировка: оклад по убыванию, при равенстве — название отдела по алфавиту.

Примеры

-- Выдача на данных «Пульса»:
-- department  | employee        | salary
-- Разработка  | Марина Лебедева | 480000
-- Руководство | Артём Кузнецов  | 480000
-- Продажи     | Вика Носова     | 320000
-- Аналитика   | Данил Крылов    | 290000
-- Дизайн      | Нина Кравец     | 280000
-- Поддержка   | Дмитрий Лапин   | 190000

-- В Поддержке 190000 получают двое; в отчёт идёт Дмитрий Лапин — он нанят раньше.

Где это пригодится

«Первый в каждой группе» — самый ходовой шаблон отчётности: топовый товар в категории, последний заказ клиента, свежая запись лога по каждому устройству. Меняются таблицы, приём остаётся тем же.

Двигайтесь по одному шагу

Подсказка 1

Отфильтруйте уволенных сотрудников и строки без оклада до ранжирования.

Подсказка 2

Разбейте нумерацию по отделам и полностью задайте порядок разрешения ничьих.

Подсказка 3

После выбора первой строки задайте сортировку итоговой выдачи.

Как выбрать одну строку в каждой группе

Сначала исключите неподходящих сотрудников, затем пронумеруйте строки внутри каждого отдела по правилам задачи.

Не оставляйте задачу изолированной