Ранжирование данных с помощью функции RANK()

Функция RANK() в SQL используется для присвоения рангов строкам в пределах заданного окна, основываясь на значениях одного или нескольких столбцов. Она предназначена для ситуаций, когда нужно упорядочить данные и учесть, что строки с одинаковыми значениями получают одинаковый ранг.

Принцип работы функции RANK()

  • Ранг присваивается: Функция RANK() назначает ранги строкам в порядке их значений. Если несколько строк имеют одинаковые значения, они получают одинаковый ранг.

  • Пропуск рангов: Если несколько строк имеют одинаковые значения, они получают одинаковый ранг, а следующий ранг пропускается. Это означает, что ранги могут быть не последовательными.

Синтаксис функции RANK()

RANK() OVER (
    PARTITION BY partition_column
    ORDER BY order_column
)
  • PARTITION BY partition_column: (Опционально) Разделяет строки на группы. Если не указано, функция применяется ко всему набору данных.

  • ORDER BY order_column: Определяет порядок, в котором будут присвоены ранги.

Примеры использования функции RANK()

Пример 1: Ранжирование сотрудников по зарплате в пределах каждого отдела

Рассмотрим таблицу employees с полями employee_id, department и salary, и мы хотим присвоить ранги сотрудникам по зарплате внутри каждого отдела.

SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;
  • PARTITION BY department: Делит данные на группы по отделам.

  • ORDER BY salary DESC: Упорядочивает сотрудников по зарплате в порядке убывания.

Результат: В каждом отделе сотрудники будут упорядочены по зарплате, и те, кто имеют одинаковую зарплату, получат одинаковый ранг. Например, если два сотрудника имеют самую высокую зарплату, они оба получат ранг 1, а следующий ранг будет 3.

Пример 2: Ранжирование студентов по баллам на экзамене

Рассмотрим таблицу students с полями student_id, exam_date и score, и мы хотим присвоить ранги студентам по баллам на экзамене для каждого экзамена.

SELECT student_id, exam_date, score,
       RANK() OVER (PARTITION BY exam_date ORDER BY score DESC) AS rank
FROM students;
  • PARTITION BY exam_date: Делит данные на группы по дате экзамена.

  • ORDER BY score DESC: Упорядочивает студентов по баллам в порядке убывания.

Результат: Студенты будут ранжированы по их баллам на каждом экзамене. Если два студента набрали одинаковое количество баллов, они будут иметь одинаковый ранг, а следующий ранг будет пропущен.

Пример 3: Ранжирование продаж по кварталам

Рассмотрим таблицу sales с полями sale_id, quarter и amount, и мы хотим присвоить ранги продаж по сумме продаж внутри каждого квартала.

SELECT sale_id, quarter, amount,
       RANK() OVER (PARTITION BY quarter ORDER BY amount DESC) AS rank
FROM sales;
  • PARTITION BY quarter: Делит данные на группы по кварталам.

  • ORDER BY amount DESC: Упорядочивает продажи по сумме в порядке убывания.

Результат: Продажи будут ранжированы по сумме продаж в пределах каждого квартала. Если несколько продаж имеют одинаковую сумму, они будут иметь одинаковый ранг.

Заключение

Функция RANK() полезна для ранжирования данных в пределах групп и учета ситуаций, когда строки имеют одинаковые значения. Она помогает выявлять позиции в упорядоченных наборах данных и может быть использована для создания отчетов, анализа и принятия решений.

Last updated