Menu
Coddy logo textTech

Топ-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().

challenge icon

Задание

Легко

Доступные таблицы и столбцы:

  • <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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Продвинутый уровень