Перейти к содержанию

LOD-выражения

LOD-выражения (Level of Detail) позволяют управлять уровнем детализации при расчете агрегатов. В виджетах простые агрегатные функции вычисляются с группировкой по полям, которые участвуют в построении виджета (находятся в секции Группы). С помощью LOD-выражений группировку для агрегатной функции можно изменить, не добавляя эту категорию в визуализацию. Управление уровнем детализации позволяет добавлять или исключать измерения из группировки, а также использовать вложенные агрегации.

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

Синтаксис

LOD-выражение указывается внутри агрегатной функции после значения, по которому выполняется расчет. Расширенный синтаксис агрегатной функции с использованием LOD-выражений:

<FUNCTION_NAME> (
                    value_1,
                    value_2,
                    ...
                    value_N
                    FIXED field_1, ..., field_N | INCLUDE field_1, ..., field_N | EXCLUDE field_1, ..., field_N
                    BEFORE FILTER BY field_1, ..., field_N
                )

Уровень детализации в LOD-выражениях задается с помощью указания ключевых слов:

  • FIXED - данные группируются по явно перечисленным полям (field_1, ..., field_N), игнорируя поля, используемые для группировки в виджете. Если измерения не заданы, то расчёт выполняется без учёта каких-либо измерений;
  • INCLUDE - перечисленные поля (field_1, ..., field_N) добавляются к группировке в виджете. Если измерения не заданы, то группировка эквивалентна той же группировке, что и в виджете;
  • EXCLUDE - перечисленные поля (field_1, ..., field_N) исключаются из группировки в виджете. Если измерения не заданы, то группировка эквивалентна той же группировке, что и в виджете.

Для расширения возможностей функций доступно управление вычислениями до фильтрации. Секция BEFORE FILTER BY указывает, что функция будет ычисляться до фильтрации по перечисленным полям.

Пример

Исходные данные: Доступны данные по сегментам, клиентам, месяцам заказа.

Цель: Для каждого сегмента вычислить максимальное количество клиентов в месяц.

Формула:

MAX(
    COUNTD(
        [klient_id]
        INCLUDE [month]
    )
)

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

В этом примере поле [month], отсутствующее в виджете, добавляется на вложенном уровне. Таким образом, на верхнем уровне агрегация будет вычисляться с группировкой по полю [segment], которое используется в структуре виджета, а вложенная агрегация - по полям [segment] и [month].

Результат: img

Подробнее

Для сверки полученного результата выведем промежуточный результат вложенной агрегации, т.е. сгруппируем показатель количества клиентов по полям Сегмент ([segment]) и Месяц заказа ([month]). И найдем максимальное значение показателя, например, по группе B2C. Оно равно 250, что совпадает с результатом, полученном выше.

img

Особенности и ограничения при использовании LOD-выраженийи

  1. LOD-выражения доступны в формулах промежуточного и итогового значений для всех виджетов кроме виджета Сводная таблица.

  2. Параметр EXCLUDE работает противоположно параметру INCLUDE. Чаще всего используется, когда в INCLUDE необходимо добавить много измерений и проще исключить меньшую часть.

  3. Любую агрегацию с INCLUDE можно заменить на агрегацию с FIXED. Например, в виджете с группировкой по полям Segment и Month агрегат SUM(SUM([Sales] INCLUDE [Region])) будет аналогичен агрегату SUM(SUM([Sales] FIXED [Segment],[Month],[Region])).

  4. Любую агрегацию с EXCLUDE можно заменить на агрегацию с FIXED. Например, в чарте с группировкой по измерениям Segment и Month показатель SUM([Sales] EXCLUDE [Month]) будет аналогичен показателю SUM([Sales] FIXED [Segment]).

  5. В LOD-выражениях можно указывать как используемые, так и не используемые в виджете поля. Однако агрегация верхнего уровня должна содержать только поля, которые используются в виджете, т.е. находятся в секции Группы и отображаются в виджете. Для виджета Таблица агрегатов и виджетов, которые основаны на Таблице агрегатов, это все поля в секции Группы. Для остальных виджетов - только поля на верхнем уровне вложенности.

    Таким образом, на верхнем уровне нельзя использовать агрегацию с непустым INCLUDE или с FIXED, содержащим измерения, которые не используются в чарте.

    Пример:

    В виджете с группировкой по [year] рассчитаем среднюю прибыль по клиентам:

    ✅ Правильно:

    AVG(
        SUM(
            [profit]
            FIXED [klient_id]
        )
    )
    

    ❌ Неправильно:

    AVG(
        SUM(
            [profit]
        )
        FIXED [klient_id]
    )
    
  6. Агрегации, находящиеся на одном уровне вложенности, должны быть согласованы. Хотя бы одна из вложенных агрегаций должна содержать все поля детализации, которые есть в других вложенных агрегациях.

    В формуле COUNTD_IF (ANY(), AVG() > 100) - AVG и ANY функции агрегации одного уровня. Если одна из вложенных функций использует детализацию по [field_1], то вторая функция должна обязательно включать детализацию по этому полю.

    ✅ Правильно:

    COUNTD_IF (
        ANY([order_id] FIXED [region]),
        AVG([sales] FIXED [region], [period]) > 100
    )
    

    ❌ Неправильно:

    COUNTD_IF (
        ANY([order_id] FIXED [region]),
        AVG([sales] FIXED [period]) > 100
    )
    
  7. На одном уровне вложенности нельзя одновременно использовать и функцию агрегации, и неагрегированные поля.

    Пример:

    Рассчитаем количество заказов, сумма выручки по которым в регионе больше 100 млн.

    ✅ Правильно:

    COUNTD_IF (
        ANY([order_id] FIXED [region]),
        SUM([sales] FIXED [region]) > 100
    )
    

    ❌ Неправильно:

    COUNTD_IF (
        [order_id],
        SUM([sales] FIXED [region]) > 100
    )
    
  8. Для расчета итоговых значений, агрегирующих промежуточные агрегаты (а не первичные данные), необходимо использовать LOD-выражения для того, чтобы явно задать вложенную детализацию, соответствующую структуре виджета. Например, если в промежуточной агрегации используется формула MAX([profit]), в виджете задана группировка по полю [segment] и необходимо в итоговой агрегации получить сумму по промежуточным агрегатам, то формула для итоговой агрегации примет вид:

    SUM(
        MAX(
            [profit]
            FIXED [segment]
        )
    )
    

img