Функция process
Документация
Главная

Функция process

Функция process используется для вычисления агрегированных значений (например, суммы, количества, минимума или максимума) по указанному измерению внутри формул разрезов и мер. Она позволяет выполнять агрегацию по выбранному измерению без необходимости вручную настраивать группировку элементов.

Функция process особенно полезна, когда требуется решить аналитические задачи, связанные с обработкой и использованием агрегированных данных, а именно:

  • Получить агрегированное значение для каждого уникального значения колонки разреза
  • Использовать результат агрегации в формулах и вычисляемых показателях
  • Работать с данными, предварительно сгруппированными по выбранной колонке разреза (измерению)
  • Применять определенные условия к агрегированным значениям, а не к отдельным строкам исходных данных

Синтаксис

Функция process вызывается с одним обязательным и одним необязательным параметром: process({агрегирующее выражение}, колонка_разреза)

ПараметрОписаниеОбязательный
{агрегирующее выражение}Выражение, содержащее агрегатную функцию, колонки, константы или переменные. Определяет, что именно агрегируется.Да
колонка разрезаКолонка измерения, по которой выполняется группировка. Если не указана, рассчитывается общая агрегацияНет

Особенности функции process:

  • Функция поддерживает только одну колонку разреза, использование нескольких колонок разреза одновременно невозможно
  • Если колонка разреза не указана, функция вычисляет общее агрегированное значение без группировки
  • Не рекомендуется использовать функцию process внутри другой функции process, так как это может привести к некорректному результату
  • Агрегирующее выражение и колонку разреза рекомендуется задавать на основе разных связанных таблиц. Использование колонки разреза из той же таблицы, по которой выполняется агрегация, может привести к дублированию данных и искажению результата
  • Функция автоматически оптимизирует вычисления: она учитывает связи между таблицами, выбирает наиболее эффективный путь к данным и объединяет несколько вызовов с одним разрезом в один расчет
  • Функция ограниченно учитывает ненаправленные (N:M) связи: они используются для доступа к колонке разреза, но не влияют на расчет агрегированных значений

Примеры использования функции process

В примерах ниже используются две таблицы процесса:

  • event_log — таблица событий, содержащая:
    • case_id — идентификатор кейса
    • event_time — время события
    • event_name — название события
  • case_table — таблица кейсов, содержащая:
    • case_id — ключ кейса, по которому таблица связана с event_log

Модель данных

Расчет длительности процесса

Функция вычисляет длительность процесса для каждого case_id. Для этого она находит самое раннее (min()) и самое позднее (max()) время события для каждого экземпляра, после чего вычисляет разницу между этими значениями в секундах с помощью date_diff('second', ...).

process(date_diff('second', min("event_log"."event_time"), max("event_log"."event_time")), "case_table"."case_id")

Расчет длительности процесса

Расчет длительности между этапами

Функция вычисляет, сколько времени прошло между двумя заданными этапами процесса для каждого case_id. Она находит самое раннее время наступления статуса Заказ готовится и самое позднее время статуса Заказ передан курьеру для каждого экземпляра со своим 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), ("case_table"."case_id"))

Расчет длительности между этапами

Сценарии протекания процесса

Функция восстанавливает последовательность событий внутри каждого case_id. Она сортирует статусы по времени и формирует текстовый сценарий, в котором каждый статус выводится на новой строке — в том порядке, в котором он произошел.

process(arrayStringConcat(arraySort((x,y)-> y, groupArray("event_log"."event_name"), groupArray("event_log"."event_time")),'\r\n'),("case_table"."case_id"))

Сценарии протекания процесса

Наличие перехода в определенном случае

Функция определяет, встречается ли у каждого case_id указанный статус. В примере проверяется, присутствует ли событие Ожидается передача курьеру среди всех статусов кейса хотя бы один раз.

if(process(countIf("event_log"."event_name", "event_log"."event_name" like 'Ожидается передача курьеру')>0, ("case_table"."case_id")), 'Есть "Ожидается передача курьеру"', 'Нет "Ожидается передача курьеру"')

Наличие перехода в определенном случае

Разбиение на группы по условию

Функция вычисляет длительность процесса для каждого case_id из таблицы event_log и распределяет их по категориям в зависимости от полученного значения. Таким образом, все кейсы распределяются по диапазонам длительности — например, менее 30 минут, от 30 минут до 1 часа и так далее.

multiIf(process(date_diff('second', min("event_log"."event_time"), max("event_log"."event_time")), "case_table"."case_id") as duration < 30*60, 'Менее 30 минут', duration<60*60, 'от 30 мин до 1 часа', duration<2*60*60, 'от 1 до 2 часов', 'Более 2 часов')

Разбиение на группы по условию

Была ли статья полезна?

Предыдущая
Функции для формул
Следующая
YAML-редактор
430006, Саранск,
Северо-восточное шоссе, д. 3
ОКВЭД 62.01
ИНН 1328​909857
Код вида деятельности
в области ИТ 15.02 и 17.01
Языки программирования