Описание: в этой статье вы узнаете о функции DENSE_RANK() в MySQL и о том, как ее применять, чтобы найти ранг строки в разделе или наборе результатов.
Введение в функции DENSE_RANK в MySQL
DENSE_RANK() является функция окна, которая присваивает ранг каждой строки в пределах раздела или результирующего набора без пробелов в рейтинге значений.
Ранг строки увеличивается на единицу из числа различных значений ранга, которые идут перед строкой.
Синтаксис функции DENSE_RANK() следующий:
DENSE_RANK() OVER ( PARTITION BY <expression>[{,<expression>...}] ORDER BY <expression> [ASC|DESC], [{,<expression>...}] )
В этом синтаксисе:
- Во-первых, предложение PARTITION BY делит наборы результатов, созданные этим предложение FROM, на разделы. Функция DENSE_RANK() применяется к каждому разделу.
- Во-вторых, предложение ORDER BY определяет порядок строк в каждом разделе, в котором работает функция DENSE_RANK().
Если в разделе есть две или более строк с одинаковым значением ранга, каждой из этих строк будет присвоен одинаковый ранг.
В отличие от функции RANK(), функция DENSE_RANK() всегда возвращает последовательные значения ранга.
Предположим, у нас есть таблица t с некоторыми примерами данных:
CREATE TABLE t ( val INT ); INSERT INTO t(val) VALUES(1),(2),(2),(3),(4),(4),(5); SELECT * FROM t;
Следующий оператор использует функцию DENSE_RANK() для присвоения ранга каждой строке:
SELECT val, DENSE_RANK() OVER ( ORDER BY val ) my_rank FROM t;
Пример функции DENSE_RANK() в MySQL
Для демонстрации мы будем использовать таблицу sales, созданную в руководстве по оконным функциям.
Следующий оператор использует функцию DENSE_RANK() для ранжирования сотрудников по продажам по сумме продаж.
SELECT sales_employee, fiscal_year, sale, DENSE_RANK() OVER (PARTITION BY fiscal_year ORDER BY sale DESC ) sales_rank FROM sales;
В этом примере:
- Во-первых, в предложении PARTITION BY разделены результирующие наборы на разделы с использованием финансового года.
- Во-вторых, в предложении ORDER BY указан порядок продаж сотрудников по продажам в порядке убывания.
- В-третьих, функция DENSE_RANK() применяется к каждому разделу с порядком строк, указанным в предложении ORDER BY.
В этой статье вы узнали, как использовать функцию DENSE_RANK() MySQL для ранжирования строк в каждом разделе набора результатов.