Top.Mail.Ru
Функция aggr
8 800 555-89-02
Документация
CTRL+K
Standalone2403
SaaS

Функция aggr

В этой статье

Функция aggr используется для расширенного агрегирования и заключается в другую агрегатную функцию. Она возвращает диапазон значений выражения, вычисленный по указанному измерению или измерениям. Схожа с запросом GROUP BY в SQL.

Используется только в формулах разрезов и мер.

При вычислении функция aggr разворачивается в агрегирующий подзапрос, результат выполнения которого присоединяется к основному запросу через join. В случае отсутствия колонок разреза подзапрос помещается в секцию основного запроса.

При вычислении функции aggr в подзапрос добавляется фильтрация основного запроса, которая не содержит формул с этой функцией. Фильтрация применяется следующим образом:

  • формируется последовательность таблиц, необходимых для вычисления результата функции aggr
  • в этой последовательности осуществляется поиск таблиц, в которых находятся колонки разреза
  • каждая из этих таблиц в последовательности заменяется на подзапрос с фильтрацией

Синтаксис

aggr({агрегирующее выражение}, колонка разреза) — функция вычисляет агрегирующее выражение по колонке разреза.

агрегирующее выражение — может содержать любое агрегирующее выражение + колонки + константы + переменные (вводимое значение, вычисляемое значение, статический список, динамический список).

колонка разреза — содержит колоноку разреза, может отсутствовать.

  • Если кроме показателей aggr({guid}_measure) и {dimension_column} для расчета больше ничего не используется, то вместо t1 join t2 используется сразу t2
  • Работает авто замена {dimension_column} для уменьшения количества связей
    • Пример 1: aggr(sum(log.revenue), case_table.case_id) использует данные двух таблиц. Так как есть связь case_table.case_id и log.case_id, будет использоваться только таблица log. Компонент case_table связывается с таблицей aggr по колонке case_table.case_id = log.case_id, потому что это заменяемые колонки
    • Пример 2: aggr(sum(log.revenue), case_table.type) использует данные двух таблиц. Сначала свяжутся данные таблицы, потом происходит расчет агрегации с группировкой по case_table.type, далее таблица case_table по левой связи с результатом по колонке type
    Во втором примере на одну связь больше.
  • Если второй параметр не указан, считается общая агрегация. Чтобы посчитать долю, введите следующее: x / aggr (sum(x))
  • Если имеется несколько функций aggr с одним разрезом, запрос объединяется
Предупреждение

Использование функции aggr внутри функции aggr может привести к некорректному отображению результата или ошибке.

Ненаправленные связи

Связь N:M — это связь между двумя таблицами, когда одному значению из первой таблицы соответствует множество значений из второй таблицы и одному значению из второй таблицы соответствует множество значений из первой таблицы. Таким образом, связь является ненаправленной.

При добавлении связей в модель данных связи N:M учитываются как обычные связи, когда проверяется, что между двумя таблицами может существовать лишь один путь по связям.

Применение:

При фильтрации учитываются как обычные связи, по которым формируются цепочки подзапросов.

При построении последовательности учитываются только при обработке функции aggr. Обработка агрегатной части функции aggr учитывает только обычные связи, связей N:M она не видит. Таблицы колонок из секции разреза функции aggr могут добавляться в последовательность через связи N:M. При этом сначала в последовательность добавляется максимально возможное количество таблиц по обычным связям. Оставшиеся таблицы добавляются по обычным связям и связям N:M. Для связей N:M также работает замена колонок.

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

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

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

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

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

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

if(aggr(countIf("event_log"."event_name", "event_log"."event_name" like 'В работе')>0, ("case_table"."case_id")), 'Есть "В работе"', 'Нет "В работе"')

Длительность между этапами в определенном кейсе

aggr(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"))

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

aggr(multiIf(median("case_table"."case_duration")<1*24*3600, 'Меньше дня', median("case_table"."case_duration")<5*24*3600, 'От 1 до 5 дней', 'Более 5 дней'), "case_table"."case_id")

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

Да
Нет
Предыдущая
Редактор формул
8 (800) 555-89-028 (495) 150-31-45team@infomaximum.com
Для бизнеса
© 20102024. ООО «Инфомаксимум»
Мы используем файлы cookies, чтобы сайт был лучше для вас.