Поиск по сайту:

Моя эпитафия: «Лень отняла его у нас раньше, чем смерть» (А. Ривароль).

Функция RANK в MySQL2 мин для чтения

FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (4 оценок, среднее: 5,00 из 5)
Загрузка...
30 октября 2019
MySQL. Математические функции
Описание: в этой статье вы узнаете о функции RANK() в MySQL и о том, как ее применять, чтобы присвоить ранг каждой строке в разделе набора результатов.

Обратите внимание, что MySQL поддерживает функцию RANK() и другие оконные функции начиная с версии 8.0

 

Введение в функцию RANK() в MySQL

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

Ниже показан синтаксис функции RANK():

RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)

 

В этом синтаксисе:

  • Во-первых, предложение PARTITION BY делит наборы результатов на разделы. Функция RANK() выполняется в разделах и реинициализируется при пересечении границы раздела.
  • Во-вторых, предложение ORDER BYRDER BYRDER BYRDER BYRDER BYRDER BYRDER BY сортирует строки в разделе по одному или нескольким столбцам или выражениям.

В отличие от функции ROW_NUMBER(), функция RANK() не всегда возвращает последовательные целые числа.

Предположим, у нас есть пример таблицы следующим образом:

CREATE TABLE t (
val INT
);

INSERT INTO t(val)
VALUES(1),(2),(2),(3),(4),(4),(5);

SELECT * FROM t;

 

Вот выheight=”156″ />

Следующий оператор использует функцию RANK() для присвоения ранга каждой строке из набора результатов в таблице t:

SELECT
val,
RANK() OVER (
ORDER BY val
) my_rank
FROM
t;

 

Как видите, второй и третий ряды имеют одинаковые связи, поэтому они получают одинаковое звание 2.

Четвертый ряд имеет ранг 4, потому что функция RANK() пропускает ранг 3.

 

Пример функции RANK() в MySQL

Давайте для демонстрации используем таблицу sales, созданную в руководстве по оконным функциям.

Если вы еще не создали таблицу sales, вот скрипт:

CREATE TABLE IF NOT EXISTS sales(
sales_employee VARCHAR(50) NOT NULL,
fiscal_year INT NOT NULL,
sale DECIMAL(14,2) NOT NULL,
PRIMARY KEY(sales_employee,fiscal_year)
);

INSERT INTO sales(sales_employee,fiscal_year,sale)
VALUES('Bob',2016,100),
('Bob',2017,150),
('Bob',2018,200),
('Alice',2016,150),
('Alice',2017,100),
('Alice',2018,200),
('John',2016,200),
('John',2017,150),
('John',2018,250);

SELECT * FROM sales;

 

На следующем рисунке показанheight=”198″ />height=”198″ />h=”233″ height=”198″ />

 

Следующий оператор использует функцию RANK() для ранжирования сотрудников по продажам по сумме продаж в каждом году:

SELECT
sales_employee,
fiscal_year,
sale,
RANK() OVER (PARTITION BY
fiscal_year
ORDER BY
sale DESC
) sales_rank
FROM
sales;

 

Читать  Транзакции в MySQL с помощью Perl

В этом примере:

  • Во-первых, предложение PARTITION BY разбивает результирующие наборы на разделы по финансовым годам.
  • Затем предложение ORDER BY сортирует сотрудников по продажам в порядке убывания.

 

Функция RANK() в MySQL с примером CTE

Следующий оператор использует функцию RANK() для поиска трех самых высоких заказов в каждом году:

WITH order_values AS(
SELECT
orderNumber,
YEAR(orderDate) order_year,
quantityOrdered*priceEach AS order_value,
RANK() OVER (
PARTITION BY YEAR(orderDate)
ORDER BY quantityOrdered*priceEach DESC
) order_value_rank
FROM
orders
INNER JOIN orderDetails USING (orderNumber)
)
SELECheight="200" />height="200" />h="344" height="200" />h="344" height="200" />QL" width="344" height="200" />

 

В этом примере:

  • Сначала мы использовали общее табличное выражение (CTE), чтобы получить номер заказа, год заказа и ранг. Чтобы ранжировать заказы по значению заказа в каждом году, мы использовали функцию RANK(), которая разбивала строки по годам заказа и сортировала значение заказа по убыванию.
  • Затем мы выбрали только ордера, чей ранг меньше или равен трем.

В этой статье вы узнали, как использовать функцию RANK() в MySQL для присвоения ранга каждой строке в наборе результатов.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Читайте также

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить
galka

Спасибо! Ваша заявка принята

close
galka

Спасибо! Ваша заявка принята

close
Яндекс.Метрика