Топ-N в группе
Часть раздела Продвинутый уровень путешествия по SQL на Coddy. Урок 23 из 27.
«Самый высокооплачиваемый сотрудник в каждом отделе» — классический пример из учебника. Рецепт всегда один: ROW_NUMBER() с PARTITION BY, затем отфильтровать строки до строки 1.
WITH ranked AS (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
)
SELECT name, department, salary FROM ranked WHERE rn = 1Нужны 3 первых результата вместо 1-го? Замените WHERE rn = 1 на WHERE rn <= 3. Хотите учитывать совпадения на верхней позиции? Замените ROW_NUMBER() на RANK().
Задание
ЛегкоДоступные таблицы и столбцы:
employees:id,name,department,salary
Верните самого высокооплачиваемого сотрудника в каждом department. Выведите name, department и salary, отсортированные по department. Если в рамках одного отдела два сотрудника делят первое место по зарплате, верните только одного: сотрудника с меньшим id.
Попробуйте сами
WITH ranked AS (
-- ROW_NUMBER() OVER (PARTITION BY department ORDER BY ...)
)
SELECT name, department, salary FROM ranked WHERE rn = 1
ORDER BY department
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Продвинутый уровень
6Рецепты аналитики
Топ-N в группеПроцент от общегоНарастающий итогОдна строка на ключИтоги — Лучшие клиентыПотренируйтесь самостоятельно: Песочница SQL