В этом руководстве вы узнаете, как использовать функцию SQL Server PERCENT_RANK() для вычисления относительного ранга строки в группе строк.
Обзор функции SQL Server PERCENT_RANK()
Функция PERCENT_RANK() похожа на функцию CUME_DIST(). Функция PERCENT_RANK() оценивает относительное положение значения в разделе результирующего набора.
Ниже показан синтаксис функции SQL Server PERCENT_RANK():
PERCENT_RANK() OVER( [PARTITION BY partition_expression, ... ] ORDER BY sort_expression [ASC | DESC], ... )
В этом синтаксисе:
РАЗДЕЛЕНИЕ ПО
Предложение PARTITION BY распределяет строки по нескольким разделам, к которым применяется функция PERCENT_RANK(). Предложение PARTITION BY является необязательным. Если вы его пропустите, функция будет обрабатывать весь результирующий набор как один раздел.
ЗАКАЗАТЬ ПО
Предложение ORDER BY определяет логический порядок строк в каждом разделе. Поскольку PERCENT_RANK() чувствителен к порядку, требуется предложение order_by_clause.
Возвращаемое значение
Результат PERCENT_RANK() больше 0 и меньше или равен 1.
0 < PERCENT_RANK() <= 1
Первая строка имеет значение ранга 0. Совпадающие значения оцениваются с одинаковым значением кумулятивного распределения.
Функция PERCENT_RANK() по умолчанию включает значения NULL и рассматривает их как минимально возможные значения.
Примеры SQL Server PERCENT_RANK()
Давайте рассмотрим несколько примеров использования функции PERCENT_RANK().
Следующий оператор создает новое представление с именем sales.vw_staff_sales для демонстрации.
CREATE VIEW sales.vw_staff_sales( staff_id, year, net_sales ) AS SELECT staff_id, YEAR(order_date), ROUND(SUM(quantity*list_price*(1-discount)),0) FROM sales.orders o INNER JOIN sales.order_items i on i.order_id = o.order_id WHERE staff_id IS NOT NULL GROUP BY staff_id, YEAR(order_date);
Пример использования функции SQL Server PERCENT_RANK() для результирующего набора
В этом примере функция PERCENT_RANK() используется для расчета процентиля продаж каждого торгового персонала в 2016 году:
SELECT CONCAT_WS(' ',first_name,last_name) full_name, net_sales, PERCENT_RANK() OVER( ORDER BY net_sales DESC ) percent_rank FROM sales.vw_staff_sales t INNER JOIN sales.staffs m on m.staff_id = t.staff_id WHERE YEAR = 2016;
Вот что получилось:
Чтобы сделать вывод более читабельным, можно использовать функцию FORMAT() для форматирования процентного ранга в процентах(%):
SELECT CONCAT_WS(' ',first_name,last_name) full_name, net_sales, FORMAT( PERCENT_RANK() OVER( ORDER BY net_sales DESC ) , 'P') percent_rank FROM sales.vw_staff_sales t INNER JOIN sales.staffs m on m.staff_id = t.staff_id WHERE YEAR = 2016;
На следующем рисунке показан новый результат:
Пример использования функции SQL Server PERCENT_RANK() для разделов
В следующем примере функция PERCENT_RANK() используется для расчета процентиля продаж для каждого сотрудника в 2016 и 2017 годах.
SELECT year, CONCAT_WS(' ',first_name,last_name) full_name, net_sales, FORMAT( PERCENT_RANK() OVER( PARTITION BY year ORDER BY net_sales DESC ) , 'P') percent_rank FROM sales.vw_staff_sales t INNER JOIN sales.staffs m on m.staff_id = t.staff_id WHERE YEAR IN(2016,2017);
Вот что получилось:
В этом примере:
- Предложение PARTITION BY распределило строки по годам на два раздела: один для 2016 года, а другой для 2017 года.
- Предложение ORDER BY сортирует строки в каждом разделе по чистым продажам от большего к меньшему.
- Функция PERCENT_RANK() применяется к каждому разделу отдельно и пересчитывает ранг при пересечении границы раздела.
В этом руководстве вы узнали, как использовать функцию SQL Server PERCENT_RANK() для вычисления относительного ранга строки в группе строк.