// практика без регистрации

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

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

  • Язык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: данные и ожидаемый результат

Таблицы и данные

CREATE TABLE departments (
  id INTEGER PRIMARY KEY,
  title TEXT NOT NULL,
  city TEXT NOT NULL
);


CREATE TABLE employees (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  department_id INTEGER NOT NULL,
  manager_id INTEGER,
  job_title TEXT NOT NULL,
  salary INTEGER,
  hired_at DATE NOT NULL,
  left_at DATE
);


INSERT INTO departments (id, title, city) VALUES
  (1, 'Поддержка', 'Москва'),
  (2, 'Разработка', 'Казань'),
  (3, 'Архив', 'Тула');

INSERT INTO employees
  (id, name, department_id, manager_id, job_title, salary, hired_at, left_at)
VALUES
  (1, 'Алексей', 1, NULL, 'Инженер', 200000, DATE '2024-01-10', NULL),
  (2, 'Белла', 1, NULL, 'Инженер', 200000, DATE '2025-01-10', NULL),
  (3, 'Кирилл', 2, NULL, 'Разработчик', 310000, DATE '2025-03-01', NULL),
  (4, 'Дарья', 2, NULL, 'Архитектор', 500000, DATE '2023-02-01', DATE '2026-01-01'),
  (5, 'Елена', 2, NULL, 'Стажёр', NULL, DATE '2026-01-05', NULL),
  (6, 'Фёдор', 3, NULL, 'Архивариус', NULL, DATE '2025-05-01', NULL);
Ожидаемый результат
departmentemployeesalary
РазработкаКирилл310000
ПоддержкаАлексей200000

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

Подсказка 1

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

Подсказка 2

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

Подсказка 3

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

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

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

Продолжите практику