Лучший в каждом отделе
Контекст
Раз в квартал «Пульс» готовит срез для совета директоров: кто в каждом отделе получает больше всех. В отчёте на отдел отводится ровно одна строка — даже если верхний оклад в отделе получают двое.
Задача
Верните по одному сотруднику на отдел — того, у кого самый высокий оклад.
Данные
Таблица departments — отделы:
| колонка | тип | что хранит |
|---|---|---|
id | int | номер отдела |
title | text | название |
city | text | город |
Таблица employees — сотрудники:
| колонка | тип | что хранит |
|---|---|---|
id | int | номер сотрудника |
name | text | имя |
department_id | int | номер отдела |
manager_id | int | номер руководителя, NULL у директора |
job_title | text | должность |
salary | int | оклад в рублях, NULL если ещё не назначен |
hired_at | date | дата найма |
left_at | date | дата ухода, NULL у действующих |
Примерные строки employees:
| id | name | department_id | salary | hired_at | left_at |
|---|---|---|---|---|---|
| 8 | Дмитрий Лапин | 3 | 190000 | 2023-07-04 | NULL |
| 16 | Егор Тарасов | 3 | 190000 | 2025-06-01 | NULL |
| 22 | Слава Дёмин | 1 | NULL | 2026-06-15 | NULL |
| 23 | Кирилл Ким | 1 | 490000 | 2023-06-01 | 2026-05-31 |
Правила
- Колонки:
department(название отдела),employee(имя сотрудника),salary. - Участвуют только действующие сотрудники (
left_at IS NULL) с назначенным окладом. - Ровно одна строка на отдел. При равных окладах побеждает нанятый раньше; если равны и даты — тот, у кого меньше
id. - Отдел, в котором не осталось подходящих сотрудников, в выдачу не попадает.
- Сортировка: оклад по убыванию, при равенстве — название отдела по алфавиту.
Примеры
-- Выдача на данных «Пульса»:
-- 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); | department | employee | salary |
|---|---|---|
| Разработка | Кирилл | 310000 |
| Поддержка | Алексей | 200000 |