Оконные функции
Оконные функции в DataLens вычисляются как агрегатные функции от показателей. Группировка по измерениям при этом отличается от группировки, заданной в чарте. Параметры группировки указываются при вызове функции в виде списка измерений, которые включаются в группировку (WITHIN ...
) или исключаются из нее (AMONG ...
).
Так как показатели — это измерения, к которым применяется агрегация, то оконные функции в DataLens можно рассматривать как агрегации агрегаций. Следует учитывать, что не для всех агрегатных функций результат агрегации частных результатов идентичен общей агрегации значений.
Например, если посчитать сумму для каждой группы, а затем сложить эти значения, то получится общая сумма во всех группах:
SUM(SUM(a) UNION SUM(b)) = SUM(a UNION b)
Если посчитать количество значений для каждой группы, а затем попробуете посчитать количество от суммы этих значений, то получится количество количеств (слагаемых в сумме), а не общее количество значений во всех группах:
COUNT(COUNT(a) UNION COUNT(b)) = 2
Пример
Category |
Sales |
OrderCount |
Sales_Furniture+Technology |
OrderCount_Furniture+Technology |
---|---|---|---|---|
Furniture | 100000 | 350 | 300000 | 2 |
Technology | 200000 | 650 | 300000 | 2 |
Где:
- Sales — показатель суммы продаж в категориях;
- Order Count — показатель количества заказов в категориях;
- Sales_Furniture+Technology — общая сумма продаж во всех категориях:
SUM_IF([Sales], [Category] = 'Furniture' TOTAL) + SUM_IF([Sales], [Category] = 'Technology' TOTAL)
- OrderCount_Furniture+Technology — количество значений показателя заказов:
COUNT(COUNT_IF([Order Count], [Category] = 'Furniture' TOTAL) + COUNT_IF([Order Count], [Category] = 'Technology' TOTAL) TOTAL)
Ограничения использования
-
Оконные функции могут иметь в качестве первого аргумента только показатели.
Для оконных функций
AVG_IF
,COUNT_IF
,SUM_IF
первым аргументом (expression
в описании функции) всегда должен быть показатель.Пример:
AVG_IF([Profit], [Profit] > 5)
Для остальных оконных функций первым (или единственным) аргументом (
value
в описании функции) также всегда должен быть показатель.Примеры:
- Корректная формула:
SUM(SUM([Profit]) TOTAL)
. - Некорректная формула:
RANK([Profit] TOTAL)
, где[Profit]
— неагрегированное выражение.
- Корректная формула:
-
В группировке оконных функций могут использоваться только измерения, участвующие в построении чарта. Только измерения, участвующие в построении чарта, задают группировку при вычислении показателя. Эти измерения определяют разбиение на группы и поэтому имеют фиксированные значения в каждой группе.
Если указать измерение, не участвующее в построении чарта, то оно не будет иметь фиксированного значения — в каждой строке группы оно может быть разным. Невозможно будет определить, какое конкретно значение этого измерения должно быть выбрано при вычислении показателя. Ограничение справедливо для типов группировки
WITHIN
иAMONG
.Примеры:
- Корректная формула:
RANK(SUM([Profit]) WITHIN [Category])
в чарте с группировкой по измерениям[Order Date]
и[Category]
. Измерение[Category]
участвует в построении чарта. - Допустимая формула:
RANK(SUM([Profit]) WITHIN [Category])
в чарте с группировкой по измерениям[Order Date]
и[City]
. Измерение[Category]
не участвует в группировке, поэтому не будет использовано при вычислении. Результат будет равносилен применению формулыRANK(SUM([Profit]) TOTAL)
. - Некорректная формула:
RANK(SUM([Profit]) AMONG [City])
в чарте с группировкой по измерениям[Order Date]
и[Category]
. Выполнение функции вызовет ошибку Unknown dimension for window.
- Корректная формула:
-
В оконных функциях не поддерживается управление уровнем детализации. Это доступно только для агрегатных функций.
-
Для функций, зависящих от порядка сортировки, перечисленные в
ORDER BY
поля должны участвовать в построении чарта. -
В настройках чарта типа Таблица не рекомендуется включать отображение Итого, если при построении таблицы используется оконная функция. Это может вызвать ошибку.
Синтаксис
Общий синтаксис оконных функций выглядит так:
<WINDOW_FUNCTION_NAME>(
arg1, arg2, ...
[ TOTAL
| WITHIN dim1, dim2, ...
| AMONG dim1, dim2, ... ]
[ ORDER BY field1, field2, ... ]
[ BEFORE FILTER BY filtered_field1, ... ]
)
Как и у обычных функций, вызов начинается с названия функции и аргументов (в данном случае — arg1, arg2, ...
).
Группировка
За аргументами следует указание группировки окна, которое может быть одним из трех типов:
TOTAL
(равносильноWITHIN
без измерений): все записи запроса попадают в одно единственное окно.WITHIN dim1, dim2, ...
: записи группируются по измерениямdim1, dim2, ...``dim1, dim2, ...
AMONG dim1, dim2, ...
: записи группируются по всем измерениям из запроса, кроме перечисленных. Например, если использовать формулуRSUM(SUM([Sales]) AMONG dim1, dim2)
с измерениямиdim1
,dim2
,dim3
,dim4
в запросе данных, то записи будут группироваться поdim3
иdim4
, так что эта формула будет эквивалентнаRSUM([Sales] WITHIN dim3, dim4)
.
Группировка опциональна. По умолчанию используется тип группировки TOTAL
.
Сортировка
За группировкой следует сортировка (ORDER BY
). Она поддерживается только для функций, зависящих от порядка сортировки:
M* |
R* |
Позиционные функции |
---|---|---|
MAVG | RAVG | LAG |
MCOUNT | RCOUNT | FIRST |
MMAX | RMAX | LAST |
MMIN | RMIN | |
MSUM | RSUM |
Сортировка для этих функций опциональна.
Результат функции зависит от полей и направления сортировки. Чтобы узнать, как сортировка влияет на расчеты, перейдите к описанию функции.
В сортировке допустимо использовать как измерения, так и показатели. Также поддерживается стандартный синтаксис ASC
/DESC
для указания направления сортировки: по нарастанию или убыванию (по умолчанию используется ASC
):
... ORDER BY [Date] ASC, SUM([Sales]) DESC, [Category] ...
Перечисленные в ORDER BY
поля дополняются списком полей из сортировки чарта.
Пример:
- Функция —
... ORDER BY [Date] DESC, [City]
. - Чарт — сортировка по
Date
иCategory
. - Результат сортировки —
Date
(по убыванию),City
,Category
.
BEFORE FILTER BY
Если какие-либо поля перечислены в BEFORE FILTER BY
, то эта оконная функция будет рассчитана до фильтрации данных по этим полям.
BEFORE FILTER BY
применяется также и ко всем вложенным оконным функциям.
Пример:
- Формула —
MAVG(RSUM([Sales]), 10 BEFORE FILTER BY [Date])
. - Эквивалент —
MAVG(RSUM([Sales] BEFORE FILTER BY [Date]), 10 BEFORE FILTER BY [Date])
.
Не используйте конфликтующие BEFORE FILTER BY
в запросе:
- Корректная формула:
MAVG(RSUM([Sales] BEFORE FILTER BY [Date], [Category]), 10 BEFORE FILTER BY [Date])
— функции вложены друг в друга, и ([Date]
) является подмножеством ([Date], [Category]
). - Корректная формула:
MAVG(RSUM([Sales] BEFORE FILTER BY [Category]), 10 BEFORE FILTER BY [Date])
— функции вложены друг в друга, поэтому списки полей комбинируются во второй из функций. - Корректная формула:
RSUM([Sales] BEFORE FILTER BY [Date], [Category]) - RSUM([Sales] BEFORE FILTER BY [Date])
— ([Date]
) является подмножеством ([Date], [Category]
). - Некорректная формула:
RSUM([Sales] BEFORE FILTER BY [Category]) - RSUM([Sales] BEFORE FILTER BY [Date])
— функции не вложены, и ни одно из ([Category]
) и ([Date]
) не является подмножеством другого.
Агрегатные функции как оконные
Следующие агрегатные функции могут быть использованы как оконные:
Агрегации | Условные агрегации |
---|---|
SUM | SUM_IF |
COUNT | COUNT_IF |
AVG | AVG_IF |
MAX | |
MIN |
Для использования их оконных вариантов необходимо явно указывать группировку (в отличие от остальных оконных функций, где она опциональна).
Например, выражение SUM([Sales]) / SUM(SUM([Sales]) TOTAL)
может быть использовано для расчета доли суммы [Sales]
по группе к итоговой сумме [Sales]
среди всех записей.
AVG
Синтаксис:AVG( value TOTAL | WITHIN ... | AMONG ... )
илиAVG( value TOTAL | WITHIN ... | AMONG ... [ BEFORE FILTER BY ... ] )
Возвращает среднее арифметическое значений выражения. Работает только с числовыми типами данных.
AVG_IF
Синтаксис:AVG_IF( expression, condition TOTAL | WITHIN ... | AMONG ... )
илиAVG_IF( expression, condition TOTAL | WITHIN ... | AMONG ... [ BEFORE FILTER BY ... ] )
Возвращает среднее для всех значений, которые удовлетворяют условию condition
. Если значения отсутствуют, то возвращается NULL
. Работает только с числовыми типами данных.
COUNT
Синтаксис:COUNT( [ value ] TOTAL | WITHIN ... | AMONG ... )
илиCOUNT( [ value ] TOTAL | WITHIN ... | AMONG ... [ BEFORE FILTER BY ... ] )
Возвращает количество элементов в заданном окне.
COUNT_IF
Синтаксис:COUNT_IF( expression, condition TOTAL | WITHIN ... | AMONG ... )
илиCOUNT_IF( expression, condition TOTAL | WITHIN ... | AMONG ... [ BEFORE FILTER BY ... ] )
Возвращает количество элементов в заданном окне, которые удовлетворяют условию expression
.
FIRST
Синтаксис:FIRST( value )
илиFIRST( value [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает значение value
из первой строки заданного окна. См. также LAST.
LAG
Синтаксис:LAG( value [ , offset [ , default ] ] )
илиLAG( value [ , offset [ , default ] ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает значение value
из строки со смещением offset
относительно текущей в рамках заданного окна:
- положительное значение
offset
делает смещение назад; - отрицательное значение
offset
делает смещение вперед.
По умолчанию offset
равно 1
.
Если значение отсутствует (offset
ссылается на строку до первой или после последней), то возвращается значение default
в качестве результата. Если default
не задано, то используется NULL
.
См. также AGO в качестве неоконной альтернативы.
LAST
Синтаксис:LAST( value )
илиLAST( value [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает значение value
из последней строки заданного окна. См. также FIRST.
MAVG
Синтаксис:MAVG( value, rows_1 [ , rows_2 ] )
илиMAVG( value, rows_1 [ , rows_2 ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает скользящее среднее значений по окну записей. Значение определяется порядком сортировки и аргументами:
rows_1 |
rows_2 |
Окно |
---|---|---|
положительное | - | Текущая запись и rows_1 предшествующих. |
отрицательное | - | Текущая запись и -rows_1 последующих. |
любой знак | любой знак | rows_1 предшествующих записей, текущая и rows_2 последующих. |
Аналогичное поведение у оконных функций MSUM, MCOUNT, MMIN, MMAX.
MAX
Синтаксис:MAX( value TOTAL | WITHIN ... | AMONG ... )
илиMAX( value TOTAL | WITHIN ... | AMONG ... [ BEFORE FILTER BY ... ] )
Возвращает максимальное значение.
Если value
:
- число — возвращает наибольшее число;
- дата — возвращает самую позднюю дату;
- строка — возвращает последнее значение в алфавитном порядке.
MCOUNT
Синтаксис:MCOUNT( value, rows_1 [ , rows_2 ] )
илиMCOUNT( value, rows_1 [ , rows_2 ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает количество значений (не равных NULL
) по окну записей, которое определяется порядком сортировки и аргументами:
rows_1 |
rows_2 |
Окно |
---|---|---|
положительное | - | Текущая запись и rows_1 предшествующих. |
отрицательное | - | Текущая запись и -rows_1 последующих. |
любой знак | любой знак | rows_1 предшествующих записей, текущая и rows_2 последующих. |
Аналогичное поведение у оконных функций MSUM, MMIN, MMAX, MAVG.
MIN
Синтаксис:MIN( value TOTAL | WITHIN ... | AMONG ... )
илиMIN( value TOTAL | WITHIN ... | AMONG ... [ BEFORE FILTER BY ... ] )
Возвращает минимальное значение.
Если value
:
- число — возвращает наименьшее число;
- дата — возвращает самую раннюю дату;
- строка — возвращает первое значение в алфавитном порядке.
MMAX
Синтаксис:MMAX( value, rows_1 [ , rows_2 ] )
илиMMAX( value, rows_1 [ , rows_2 ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает скользящий максимум значений по окну записей. Значение определяется порядком сортировки и аргументами:
rows_1 |
rows_2 |
Окно |
---|---|---|
положительное | - | Текущая запись и rows_1 предшествующих. |
отрицательное | - | Текущая запись и -rows_1 последующих. |
любой знак | любой знак | rows_1 предшествующих записей, текущая и rows_2 последующих. |
Аналогичное поведение у оконных функций MSUM, MCOUNT, MMIN, MAVG.
MMIN
Синтаксис:MMIN( value, rows_1 [ , rows_2 ] )
илиMMIN( value, rows_1 [ , rows_2 ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает скользящий минимум значений по окну записей, определяемому порядком сортировки и аргументами:
rows_1 |
rows_2 |
Окно |
---|---|---|
положительное | - | Текущая запись и rows_1 предшествующих. |
отрицательное | - | Текущая запись и -rows_1 последующих. |
любой знак | любой знак | rows_1 предшествующих записей, текущая и rows_2 последующих. |
Аналогичное поведение у оконных функций MSUM, MCOUNT, MMAX, MAVG.
MSUM
Синтаксис:MSUM( value, rows_1 [ , rows_2 ] )
илиMSUM( value, rows_1 [ , rows_2 ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает скользящую сумму значений по окну записей, которое определяется порядком сортировки и аргументами:
rows_1 |
rows_2 |
Окно |
---|---|---|
положительное | - | Текущая запись и rows_1 предшествующих. |
отрицательное | - | Текущая запись и -rows_1 последующих. |
любой знак | любой знак | rows_1 предшествующих записей, текущая и rows_2 последующих. |
Аналогичное поведение у оконных функций MCOUNT, MMIN, MMAX, MAVG.
RANK
Синтаксис:RANK( value [ , direction ] )
илиRANK( value [ , direction ] [ TOTAL | WITHIN ... | AMONG ... ] [ BEFORE FILTER BY ... ] )
Выполняет ранжирование значений с пропусками: возвращает порядковый номер строки при сортировке по value
. Строки, которые соответствуют одному и тому же значению value
, имеют одно и то же значение ранга. Если первые две строки получают ранг 1
, то ранг следующей строки (если значение value
не совпадает) будет равен 3
. Значение 2
в этом случае пропускается.
Если direction
равно "desc"
или не указано, то ранжирование происходит от большего к меньшему, если "asc"
, то от меньшего к большему. По умолчанию используется "desc"
.
См. также RANK_DENSE, RANK_UNIQUE, RANK_PERCENTILE.
RANK_DENSE
Синтаксис:RANK_DENSE( value [ , direction ] )
илиRANK_DENSE( value [ , direction ] [ TOTAL | WITHIN ... | AMONG ... ] [ BEFORE FILTER BY ... ] )
Выполняет ранжирование значений без пропусков: возвращает порядковый номер строки при сортировке по value
. Строки, которые соответствуют одному и тому же значению value
, имеют одно и то же значение ранга. Если первые две строки получают ранг 1
, то ранг следующей строки (если значение value
не совпадает) будет равен 2
. Значения ранга не пропускаются.
Если direction
равно "desc"
или не указано, то ранжирование происходит от большего к меньшему, если "asc"
, то от меньшего к большему. По умолчанию используется "desc"
.
См. также RANK, RANK_DENSE, RANK_PERCENTILE.
RANK_PERCENTILE
Синтаксис:RANK_PERCENTILE( value [ , direction ] )
илиRANK_PERCENTILE( value [ , direction ] [ TOTAL | WITHIN ... | AMONG ... ] [ BEFORE FILTER BY ... ] )
Выполняет относительное ранжирование. Возвращает дробный ранг (от 0
до 1
). Расчитывается как (RANK(...) - 1) / (количество строк)
.
Если direction
равно "desc"
или не указано, то ранжирование происходит от большего к меньшему, если "asc"
, то от меньшего к большему. По умолчанию используется "desc"
.
См. также RANK, RANK_DENSE, RANK_UNIQUE.
RANK_UNIQUE
Синтаксис:RANK_UNIQUE( value [ , direction ] )
илиRANK_UNIQUE( value [ , direction ] [ TOTAL | WITHIN ... | AMONG ... ] [ BEFORE FILTER BY ... ] )
Выполняет уникальное ранжирование. Возвращает порядковый номер строки при сортировке по value
. Строки, которые соответствуют одному и тому же значению value
, имеют разные значения ранга. Ни для каких двух строк значения не совпадают. Принимает все значения от 1
до значения, которое равно количеству строк.
Если direction
равно "desc"
или не указано, то ранжирование происходит от большего к меньшему, если "asc"
, то от меньшего к большему. По умолчанию используется "desc"
.
См. также RANK, RANK_DENSE, RANK_PERCENTILE.
RAVG
Синтаксис:RAVG( value [ , direction ] )
илиRAVG( value [ , direction ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает среднее арифметическое значений в рамках окна записей, определяемого аргументом direction
:
direction |
Окно |
---|---|
"asc" |
От первой записи до текущей. |
"desc" |
От текущей записи до последней. |
По умолчанию используется значение "asc"
.
Аналогичное поведение у оконных функций RSUM, RCOUNT, RMIN, RMAX.
RCOUNT
Синтаксис:RCOUNT( value [ , direction ] )
илиRCOUNT( value [ , direction ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает количество значений в рамках окна записей, определяемого порядком сортировки и значением аргумента direction
:
direction |
Окно |
---|---|
"asc" |
От первой записи до текущей. |
"desc" |
От текущей записи до последней. |
По умолчанию используется значение "asc"
.
Аналогичное поведение у оконных функций RSUM, RMIN, RMAX, RAVG.
RMAX
Синтаксис:RMAX( value [ , direction ] )
илиRMAX( value [ , direction ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает максимальное из значений в рамках окна записей, определяемого порядком сортировки и значением аргумента direction
:
direction |
Окно |
---|---|
"asc" |
От первой записи до текущей. |
"desc" |
От текущей записи до последней. |
По умолчанию используется значение "asc"
.
Аналогичное поведение у оконных функций RSUM, RCOUNT, RMIN, RAVG.
RMIN
Синтаксис:RMIN( value [ , direction ] )
илиRMIN( value [ , direction ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает минимальное из значений в рамках окна записей, определяемого порядком сортировки и значением аргумента direction
:
direction |
Окно |
---|---|
"asc" |
От первой записи до текущей. |
"desc" |
От текущей записи до последней. |
По умолчанию используется значение "asc"
.
Аналогичное поведение у оконных функций RSUM, RCOUNT, RMAX, RAVG.
RSUM
Синтаксис:RSUM( value [ , direction ] )
илиRSUM( value [ , direction ] [ TOTAL | WITHIN ... | AMONG ... ] [ ORDER BY ... ] [ BEFORE FILTER BY ... ] )
Возвращает сумму значений в рамках окна записей, определяемого порядком сортировки и значением аргумента direction
:
direction |
Окно |
---|---|
"asc" |
От первой записи до текущей. |
"desc" |
От текущей записи до последней. |
По умолчанию используется значение "asc"
.
Аналогичное поведение у оконных функций RCOUNT, RMIN, RMAX, RAVG.
SUM
Синтаксис:SUM( value TOTAL | WITHIN ... | AMONG ... )
илиSUM( value TOTAL | WITHIN ... | AMONG ... [ BEFORE FILTER BY ... ] )
Возвращает сумму всех значений выражения. Работает только с числовыми типами данных.
SUM_IF
Синтаксис:SUM_IF( expression, condition TOTAL | WITHIN ... | AMONG ... )
илиSUM_IF( expression, condition TOTAL | WITHIN ... | AMONG ... [ BEFORE FILTER BY ... ] )
Возвращает сумму всех значений выражения, которые удовлетворяют условию condition
. Работает только с числовыми типами данных.