В этом руководстве вы узнаете, как использовать функцию SQL Server CUME_DIST() для вычисления кумулятивного распределения значения в группе значений.
Введение в функцию SQL Server CUME_DIST()
Иногда вам нужно создать отчет, содержащий верхние или нижние значения x% из набора данных, например, верхние 5% сотрудников отдела продаж по чистым продажам. Один из способов сделать это с помощью SQL Server — использовать функцию CUME_DIST().
Функция CUME_DIST() вычисляет кумулятивное распределение значения в группе значений. Проще говоря, она вычисляет относительное положение значения в группе значений.
Ниже показан синтаксис функции CUME_DIST():
CUME_DIST() OVER(
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
Давайте рассмотрим этот синтаксис подробнее.
РАЗДЕЛЕНИЕ ПО пункту
Предложение PARTITION BY распределяет строки по нескольким разделам, к которым применяется функция CUME_DIST().
Предложение PARTITION BY является необязательным. Функция CUME_DIST() будет обрабатывать весь результирующий набор как один раздел, если вы опустите предложение PARTITION BY.
Предложение ORDER BY
Предложение ORDER BY определяет логический порядок строк в каждой секции, к которой применяется функция CUME_DIST(). Предложение ORDER BY рассматривает значения NULL как наименьшие возможные значения.
Возвращаемое значение
Результат CUME_DIST() больше 0 и меньше или равен 1.
0 < CUME_DIST() <= 1
Функция возвращает те же самые значения кумулятивного распределения для тех же самых значений связей.
Примеры SQL Server CUME_DIST()
Давайте рассмотрим несколько примеров использования функции CUME_DIST().
Пример использования функции SQL Server CUME_DIST() для набора результатов
В следующем операторе рассчитывается процентиль продаж для каждого торгового персонала в 2017 году:
SELECT
CONCAT_WS(' ',first_name,last_name) full_name,
net_sales,
CUME_DIST() OVER(
ORDER BY net_sales DESC
) cume_dist
FROM
sales.vw_staff_sales t
INNER JOIN sales.staffs m on m.staff_id = t.staff_id
WHERE
year = 2017;
Вот результат:

Как показано в результатах, 50% торгового персонала имеют чистый объем продаж более 285 тыс.
Использование функции SQL Server CUME_DIST() на примере раздела
В этом примере функция CUME_DIST() используется для расчета процентиля продаж для каждого торгового персонала в 2016 и 2017 годах.
SELECT
CONCAT_WS(' ',first_name,last_name) full_name,
net_sales,
year,
CUME_DIST() OVER(
PARTITION BY year
ORDER BY net_sales DESC
) cume_dist
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 сортирует строки в каждом разделе по чистым продажам от большего к меньшему, к которому применяется функция CUME_DIST().
Чтобы получить 20% лучших сотрудников отдела продаж по чистым продажам за 2016 и 2017 годы, используйте следующий запрос:
WITH cte_sales AS(
SELECT
CONCAT_WS(' ',first_name,last_name) full_name,
net_sales,
year,
CUME_DIST() OVER(
PARTITION BY year
ORDER BY net_sales DESC
) cume_dist
FROM
sales.vw_staff_sales t
INNER JOIN sales.staffs m
ON m.staff_id = t.staff_id
WHERE
year IN(2016,2017)
)
SELECT
*
FROM
cte_sales
WHERE
cume_dist <= 0.20;
На следующем рисунке показан результат:

В этом руководстве вы узнали, как использовать функцию SQL Server CUME_DIST() для расчета кумулятивного распределения значения в группе значений.


