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

Внутренние и внешние выражения множества

Выражения множества могут использоваться во внутренних и внешних функциях агрегирования и заключаются в фигурные скобки.

Когда выражение множества используется внутри функции агрегирования, оно может выглядеть следующим образом:

Пример: Внутреннее выражение множества

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: Внутреннее выражение множества с идентификатором множества

{<Year={2023}>} Sum(Sales) / Count({1} distinct OrderNumber)

В приведенном выше выражении внутреннее выражение множества Count({1} distinct OrderNumber) состоит из идентификатора множества {1}. Когда оценивается это внутреннее выражение множества, область, определенная во внешнем выражении множества {<Year={2023}>}, не применяется.

Пример 2: Внутренние выражения множества без идентификаторов множества

{<Year={2023}>} Sum ({<Status={'Confirmed'}>} Sales_Stream1) + Sum ({<UpdatedStatus={'Confirmed'}>} Sales_Stream2)

В приведенном выше выражении внутренние выражения множества 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(), и функция внешнего агрегирования наследуют контекст от внешнего выражения множества.

Цепочки из нескольких внешних и внутренних выражений множества

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

{<Year={2021}>} {<Region={"Europe"}>} Sum( {$<Product={"XI345"}>} Sales )

Выражения множества будут применяться слева направо. Это означает, что если два выражения множества используют конфликтующие множества, то приоритет будет иметь самое крайнее выражение справа.

Хотя количество выражений внешнего множества, соединенных в цепочку таким образом, не ограничено, количество выражений внутреннего множества ограничено одним. Если несколько выражений внутреннего множества расположены рядом друг с другом, это не приведет к ошибке, но при оценке будет использовано только самое крайнее выражение справа.

Наследование выражений множества

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

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

Пустые множества выборки

При оценке измерения в выражении множества возможно, что множество не содержит никаких данных. Это называется «пустое множество». Пустые множества могут встречаться во многих случаях, примеры которых описаны далее.

  • Неверное определение выражения. Например, при попытке найти значение 2025 с выражением множества {<OrderYear={‘2025’}>}, выражение записывается как {<OrderYear={‘0025’}>}.

  • Во время анализа происходит выборка в измерении, отличном от того, на которое ссылается выражение, и в результате этой выборки для измерения выражения множества нет доступных данных. Например, пользователь создает выборку для категории Region='Europe' и фильтры выражений множества для категории {<ProductCategory={‘Shirts’}>} Sum (Sales). Если в Европе не продается ни одной рубашки, выражение множества содержит пустое множество.

  • Пустое множество явно определено в выражении. Этот не такой популярный и полезный вариант, но он технически возможен. Пример: {<Year={}>}

Неявное очищение множества выборки

Если в результате применения выражения множества получилось пустое множество для одного из измерений (см. раздел Пустые множества выборки) и после этого будет применено еще одно выражение множества, то множество выборки для этого измерения будет очищено (восстановлено назад к полному множеству) непосредственно перед применением следующего выражения множества. Под очищенным множеством выборки подразумевается, что будут включены все значения. Однако обратите внимание, что это очищение происходит только в том случае, если после выражения множества, в котором создается пустое множество, применяется еще одно или несколько дополнительных внешних выражений множества.

Далее приведен пример того, в каких случаях может получиться очищенное множество выборки.

{<Year={}>} {<Region={"Europe"}>} Sum( Sales )

Year={} создаст пустое множество для измерения Year. Это означает, что множество выборки для Year очистится, когда множество будет передано следующему выражению множества, которое содержит Region={Europe}. Обратите внимание, что очистить выборку можно только для одного измерения. Множества в других измерениях, включая множества в одном выражении множества, будут переданы без изменений.

Далее приведен еще один пример очищенного множества выборки.

{<Year={}, Product={"XI345"}>} {<Region={"Europe"}>} Sum(Sales)

В приведенном выше примере происходит указанное далее.

  • Применяются множества выбора Product={"XI345"} и Region={"Europe"}.

  • Year={} не применяется. Это происходит потому, что это множество очищается при применении последнего выражения множества — {<Region={"Europe"}>}.

Перемещение компонента выражения множества в последнее внешнее выражение множества предотвратит неявное очищение. Приведем пример.

{<Product={"XI345"}>} {<Year={}, Region={"Europe"}>} Sum(Sales)

Здесь мы перенесли выражение Year в последнее выражение множества в цепочке. Это предотвратит неявное очищение, и пустая выборка для измерения Year будет фактически использована для агрегации Sum.

В любом случае при очищении множеств выборки возможно нежелательное поведение. Чтобы улучшить анализ и упростить написание цепочек выражений множеств, используйте флаг сохранения пустого множества. Для получения дополнительной информации см. раздел Флаг сохранения пустого множества (выражения внешнего множества).

Флаг сохранения пустого множества (выражения внешнего множества)

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

{& <Year={}, Product={XI345}>} {<Region={Europe}>} Sum( Sales )

В этом примере Year={} определяет пустое множество выборки для категории Year. Без символа & выражение {<Region={Europe}>} привело бы к очищению пустого множества Year, в результате чего в расчете агрегации использовались бы все данные. Но если есть символ &, то при агрегировании учитывается пустое множество выборки Year, что дает более понятный результат.

Подробную информацию о флаге сохранения пустого набора см. Флаг сохранения пустого набора.

Помогла ли вам эта страница?

Если вы обнаружили какую-либо проблему на этой странице или с ее содержанием — будь то опечатка, пропущенный шаг или техническая ошибка, сообщите нам об этом!