Функция process
Функция process используется для расширенного агрегирования и заключается в другую агрегатную функцию. Она возвращает диапазон значений выражения, вычисленный по указанному измерению или измерениям. Схожа с запросом GROUP BY в SQL.
Используется только в формулах разрезов и мер.
При вычислении функция process разворачивается в агрегирующий подзапрос, результат выполнения которого присоединяется к основному запросу через join. В случае отсутствия колонок разреза подзапрос помещается в секцию основного запроса.
При вычислении функции process в подзапрос добавляется фильтрация основного запроса, которая не содержит формул с этой функцией. Фильтрация применяется следующим образом:
- формируется последовательность таблиц, необходимых для вычисления результата функции process
- в этой последовательности осуществляется поиск таблиц, в которых находятся колонки разреза
- каждая из этих таблиц в последовательности заменяется на подзапрос с фильтрацией
Синтаксис
process({агрегирующее выражение}, колонка разреза)
— функция вычисляет агрегирующее выражение по колонке разреза.
агрегирующее выражение
— может содержать любое агрегирующее выражение + колонки + константы + переменные (вводимое значение, вычисляемое значение, статический список, динамический список).
колонка разреза
— содержит колонку разреза, может отсутствовать.
- Если кроме показателей process({guid}_measure) и {dimension_column} для расчета больше ничего не используется, то вместо t1 join t2 используется сразу t2
- Работает автозамена {dimension_column} для уменьшения количества связей
- Пример 1: process(sum(log.revenue), case_table.case_id) использует данные двух таблиц. Так как есть связь case_table.case_id и log.case_id, будет использоваться только таблица log. Компонент case_table связывается с таблицей process по колонке case_table.case_id = log.case_id, потому что это заменяемые колонки
- Пример 2: process(sum(log.revenue), case_table.type) использует данные двух таблиц. Сначала свяжутся данные таблицы, потом происходит расчет агрегации с группировкой по case_table.type, далее таблица case_table по левой связи с результатом по колонке type
- Если второй параметр не указан, считается общая агрегация. Чтобы посчитать долю, введите следующее:
x / process (sum(x))
- Если имеется несколько функций process с одним разрезом, запрос объединяется
Использование функции process внутри функции process может привести к некорректному отображению результата или ошибке.
- Функция работает только с одной колонкой разреза. Невозможно использовать несколько колонок разреза.
- В качестве колонки разреза не рекомендуется использовать поле из той же таблицы, откуда агрегируются данные. Используйте поле из связанной таблицы-справочника, где поле группировки есть в одном экземпляре. В противном случае может произойти умножение данных, и результат будет некорректным.
Ненаправленные связи
Связь N:M — это связь между двумя таблицами, когда одному значению из первой таблицы соответствует множество значений из второй таблицы и одному значению из второй таблицы соответствует множество значений из первой таблицы. Таким образом, связь является ненаправленной.
При добавлении связей в модель данных связи N:M учитываются как обычные связи, когда проверяется, что между двумя таблицами может существовать лишь один путь по связям.
Применение:
При фильтрации учитываются как обычные связи, по которым формируются цепочки подзапросов.
При построении последовательности учитываются только при обработке функции process. Обработка агрегатной части функции process учитывает только обычные связи, связей N:M она не видит. Таблицы колонок из секции разреза функции process могут добавляться в последовательность через связи N:M. При этом сначала в последовательность добавляется максимально возможное количество таблиц по обычным связям. Оставшиеся таблицы добавляются по обычным связям и связям N:M. Для связей N:M также работает замена колонок.
Примеры использования функции
Расчет длительности процесса
process(date_diff('second', min("event_log"."event_time"), max("event_log"."time")), "case_table"."case_id")
Сценарии протекания процесса
process(arrayStringConcat(arraySort((x,y)-> y, groupArray("event_log"."event_name"), groupArray("event_log"."event_time")),'\r\n'),("case_table"."case_id"))
Наличие перехода в определенном случае
if(process(countIf("event_log"."event_name", "event_log"."event_name" like 'В работе')>0, ("case_table"."case_id")), 'Есть "В работе"', 'Нет "В работе"')
Длительность между этапами в определенном кейсе
process(if((argMaxIf(toUnixTimestamp("event_log"."event_time"), "event_log"."event_time", "event_log"."event_name" = 'Заявка - Выполнена') - argMinIf(toUnixTimestamp("event_log"."event_time"), "event_log"."event_time", "event_log"."event_name" = 'Заявка - Открыта') as duration)>0, duration, 0), ("cases"."case_id"))
Разбиение на группы по условию
process(multiIf(median("case_table"."case_duration")<1*24*3600, 'Меньше дня', median("case_table"."case_duration")<5*24*3600, 'От 1 до 5 дней', 'Более 5 дней'), "case_table"."case_id")
Была ли статья полезна?