Топ-N в группе
Часть раздела Продвинутый уровень путешествия по SQL на Coddy — урок 23 из 27.
«Самый высокооплачиваемый сотрудник в каждом отделе» — это классический пример. Решение всегда заключается в использовании ROW_NUMBER() с PARTITION BY и последующей фильтрации по первой строке.
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().
Задание
ЛегкоДоступные таблицы и столбцы:
<strong>employees</strong>:<strong>id</strong>,<strong>name</strong>,<strong>department</strong>,<strong>salary</strong>
Верните самого высокооплачиваемого сотрудника в каждом department. Выведите name, department и salary, отсортированные по department. Если два сотрудника претендуют на первое место в отделе, верните только одного: того, у которого меньше id.
Шпаргалка
Чтобы получить первые N строк для каждой группы, используйте ROW_NUMBER() с PARTITION BY, затем отфильтруйте:
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- Измените
WHERE rn = 1наWHERE rn <= 3для получения топ-3 - Замените
ROW_NUMBER()наRANK(), чтобы учитывать одинаковые значения
Попробуйте сами
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 в группеПроцент от общегоНарастающий итогОдна строка на ключИтоги — Лучшие клиенты