Внутренние и внешние выражения множества
Выражения множества могут использоваться во внутренних и внешних функциях агрегирования и заключаются в фигурные скобки.
Когда выражение множества используется внутри функции агрегирования, оно может выглядеть следующим образом:
Пример: Внутреннее выражение множества
Sum( {$<Year={2021}>} Sales )
Используйте выражение множества вне функции агрегирования, если имеются выражения с несколькими агрегированиями и нужно избежать написания одного и того же выражения множества в каждой функции агрегирования.
Если используется внешнее выражение множества, оно должно быть помещено в начало определения области.
Пример: Внешнее выражение множества
{<Year={2021}>} Sum(Sales) / Count(distinct Customer)
Если используется выражение множества вне функции агрегирования, его также можно применить к существующим основным мерам.
Пример: Внешнее выражение множества применяется к основной мере
{<Year={2021}>} [Master Measure]
Выражение множества, используемое вне функций агрегирования, влияет на все выражение, если оно не заключено в скобки, тогда скобки определяют область. В приведенном ниже примере определения лексической области выражение множества применяется только к агрегированию внутри скобок.
Пример: Определение лексической области
( {<Year={2021}>} Sum(Amount) / Count(distinct Customer) ) – Avg(CustomerSales)
Правила
Лексическая область
Выражение множества влияет на все выражение, если оно не заключено в скобки. В этом случае скобки определяют лексическую область.
Позиция
Выражение множества должно быть помещено в начало определения лексической области.
Контекст
Контекст — это выборка, имеющая отношение к выражению. Традиционно контекст всегда был состоянием по умолчанию для текущей выборки. Но если для объекта установлено альтернативное состояние, контекстом будет альтернативное состояние текущей выборки.
Контекст также можно определить в виде внешнего выражения множества.
Наследование
Внутренние выражения множества имеют приоритет над внешними. Если внутреннее выражение множества содержит идентификатор множества, он переопределяет контекст, определенный во внешнем выражении множества. В противном случае вычисляются и внутренние, и внешние выражения множества.
Пример 1: Внутреннее выражение множества с идентификатором множества
В приведенном выше выражении внутреннее выражение множества Count({1} distinct OrderNumber) состоит из идентификатора множества {1}. Когда оценивается это внутреннее выражение множества, область, определенная во внешнем выражении множества {<Year={2023}>}, не применяется.
Пример 2: Внутренние выражения множества без идентификаторов множества
В приведенном выше выражении внутренние выражения множества Sum ({<Status={'Confirmed'}>} Sales_Stream1) и Sum ({<UpdatedStatus={'Confirmed'}>} Sales_Stream2) не содержит идентификаторов множества. Поэтому внешнее выражение множества {<Year={2023}>} и оба внутренних выражения множества применяются при вычислении результата все вместе.
Назначение множества элементов
Назначение множества элементов определяет способ объединения двух выборок. Если используется обычный знак равенства, выборка во внутреннем выражении множества имеет приоритет. В противном случае будет использоваться неявный оператор множества.
{<Field={value}>} — эта внутренняя выборка заменяет любую внешнюю выборку в “Field”.
{<Field+={value}>} — эта внутренняя выборка объединяется с внешней выборкой в “Field” с помощью оператора объединения.
{<Field*={value}>} — эта внутренняя выборка объединяется с внешней выборкой в “Field” с помощью оператора пересечения.
Наследование в несколько этапов
Наследование может происходить в несколько этапов. Примеры:
Текущая выборка → Sum(Amount)
Функция агрегирования будет использовать контекст, который здесь является текущей выборкой.
Текущая выборка → {<Set1>} Sum(Amount)
Set1 будет наследоваться от текущей выборки, а результат будет контекстом для функции агрегирования.
Текущая выборка → {<Set1>} ({<Set2>} Sum(Amount))
Set2 будет наследоваться от множества Set1, которое в свою очередь будет наследоваться от текущей выборки, а результат будет контекстом для функции агрегирования.
Функция Aggr()
Функция Aggr() создает вложенное агрегирование, которое имеет два независимых агрегирования. В приведенном ниже примере Count() вычисляется для каждого значения Dim и полученный массив агрегируется с помощью функции Sum().
Пример:
Sum(Aggr(Count(X),Dim))
Count() — внутреннее агрегирование, а Sum() — внешнее агрегирование.
Внутреннее агрегирование не наследует никакого контекста от внешнего агрегирования.
Внутреннее агрегирование наследует контекст от функции Aggr(), которая может содержать выражение множества.
И функция Aggr(), и функция внешнего агрегирования наследуют контекст от внешнего выражения множества.