Резюме : в этой статье вы узнаете, как использовать функцию PERCENT_RANK() в MySQL для вычисления относительного ранга строки в пределах раздела или набора результатов.
PERCENT_RANK() является оконной функцией, которая вычисляет относительный ранг в строке в пределах раздела или результирующий набор.
Ниже показан синтаксис функции PERCENT_RANK():
PERCENT_RANK() OVER ( PARTITION BY expr,... ORDER BY expr [ASC|DESC],... )
Функция PERCENT_RANK() возвращает число, которое находится в интервале от нуля до единицы.
Для указанной строки PERCENT_RANK() вычисляется ранг этой строки минус один, деленный на 1 меньше, чем количество строк в оцененном разделе или наборе результатов запроса:
(rank - 1) / (total_rows - 1)
В этой формуле rank – ранг указанной строки, а total_rows – количество оцениваемых строк.
Функция PERCENT_RANK() всегда возвращает ноль для первой строки в перегородке или результирующий набор. Повторяющиеся значения столбца получат одно и то же значение PERCENT_RANK().
Подобно другим оконным функциям, предложение PARTITION BY распределяет строки по разделам, а предложение ORDER BY определяет логический порядок строк в каждом разделе. Функция PERCENT_RANK() вычисляется для каждого упорядоченного разбиения самостоятельно.
Оба оператора PARTITION BYи ORDER BY не являются обязательными. Однако PERCENT_RANK() это чувствительная к порядку функция, поэтому вы всегда должны использовать это предложение ORDER BY.
Давайте создадим новую таблицу с именем productLineSalesна основе orders, таблиц orderDetails и products из базы данных выборки :
CREATE TABLE productLineSales SELECT productLine, YEAR(orderDate) orderYear, quantityOrdered * priceEach orderValue FROM orderDetails INNER JOIN orders USING (orderNumber) INNER JOIN products USING (productCode) GROUP BY productLine , YEAR(orderDate);
В таблице productLineSales хранятся сводные данные о продажах, в том числе линейка продуктов, год заказа и стоимость заказа.
Следующий запрос находит относительный ранг каждой линейки продуктов по значениям заказа:
WITH t AS ( SELECT productLine, SUM(orderValue) orderValue FROM productLineSales GROUP BY productLine ) SELECT productLine, orderValue, ROUND( PERCENT_RANK() OVER ( ORDER BY orderValue ) ,2) percentile_rank FROM t;
В этом примере:
Следующий оператор возвращает процентное ранжирование товарных линий по значениям заказа в каждом году:
SELECT productLine, orderYear, orderValue, ROUND( PERCENT_RANK() OVER ( PARTITION BY orderYear ORDER BY orderValue ),2) percentile_rank FROM productLineSales;
В этом примере мы разделили значения заказа продуктовых линеек по году заказа. Затем PERCENT_RANK() применяется к каждому разделу.
В этой статье вы узнали, как использовать функцию PERCENT_RANK() в MySQL для вычисления процентного ранга строки в разделе или наборе результатов.