Аналитический вариант
CUME_DIST( ) OVER ( [ query_partition_clause ] order_by_clause )
Функция CUME_DIST рассчитывает кумулятивное распределение значения в наборе данных. Возвращаемое значение находится в диапазоне от 0 до 1. Функция на вход принимает числовой тип данных, или тип данных, который может неявно преобразовать в числовой.
Кумулятивная функция распределения (или просто функция распределения) в теории вероятностей однозначно задаёт распределение случайной величины или случайного вектора.
Пример:
with t as (select 1 id, 10 val from dual union all select 2 id, 20 val from dual union all select 3 id, 30 val from dual union all select 4 id, 50 val from dual union all select 5 id, 70 val from dual ) select id, val, CUME_DIST() OVER (order by val) "Cume_Dist" from t order by val; ID VAL Cume_Dist ---------- ---------- ---------- 1 10 0,2 2 20 0,4 3 30 0,6 4 50 0,8 5 70 1
Каким образом происходит расчёт:
1) Подсчитываем количество чисел в наборе — 5
2) Вероятность одного числа равна 1/n, где n количество чисел;
Таким образом, закон распределения вероятностей есть функция р(х)=1/5 для любого значения х из множества {10, 20, 30, 50, 70}.
3) Математическое ожидание случайной величины определяется формулой
Подставляем наши значения
10 (1) = 1/5 = 1/5 * 1= 0.2
20 (2) = 1/5+1/5 = 1/5 * 2 = 0.4
30 (3) = 1/5+1/5+1/5 = 1/5 * 3= 0.6
50 (4) = 15/+1/5+1/5+1/5 = 1/5 * 4 = 0.8
70 (5) = 15/+1/5+1/5+1/5 +1/5 = 1/5 * 5 = 1
Агрегатный вариант
CUME_DIST(expr[,expr ]...) WITHIN GROUP (ORDER BY expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] [, expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] ]... )
Использование функции CUME_DIST как агрегатной, позволяет рассчитывать распределение переданного числа в наборе данных.
Пример
with t as (select 1 id, 10 val from dual union all select 2 id, 20 val from dual union all select 3 id, 30 val from dual union all select 5 id, 70 val from dual ) select CUME_DIST(50) within group (order by val ) "Cume_Dist" from t order by val; Cume_Dist ---------- 0,8
Последние комментарии