Поделиться через


OFFSET

Область применения: вычисление вычисляемого столбца вычисляемой таблицы Меры визуального элемента

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

Синтаксис

OFFSET ( <delta>[, <relation> or <axis>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>][, <reset>] )

Параметры

Термин Определение
delta Число строк до (отрицательное значение) или после (положительное значение) текущей строки, из которой необходимо получить данные. Это может быть любое выражение DAX, возвращающее скалярное значение.
relation (Необязательно) Табличное выражение, из которого возвращается выходная строка.
Если задано, все столбцы в <partitionBy> должны поступать из нее или связанной таблицы.
Если опущено:
— <orderBy> должен быть явно указан.
— Все <выражения orderBy> и <partitionBy> должны быть полными именами столбцов и поступать из одной таблицы.
— Значение по умолчанию — ALLSELECTED() всех столбцов в <порядке> и <partitionBy>.
Ось X (Необязательно) Ось в визуальной форме. Доступно только в визуальных вычислениях и заменяет <отношение>.
orderBy (Необязательно) Предложение ORDERBY(), содержащее выражения, определяющие порядок сортировки каждой секции.
Если опущено:
— <связь> должна быть явно указана.
— по умолчанию упорядочивается по каждому столбцу в <отношении> , который еще не указан в <partitionBy>.
Пробелы (Необязательно) Перечисление, определяющее, как обрабатывать пустые значения при сортировке.
Этот параметр зарезервирован для дальнейшего использования.
В настоящее время единственным поддерживаемым значением является DEFAULT, где поведение числовых значений — пустые значения упорядочены от нуля до отрицательных значений. Поведение строк является пустым значением, упорядоченным перед всеми строками, включая пустые строки.
partitionBy (Необязательно) Предложение PARTITIONBY(), содержащее столбцы, определяющие <секционирование отношений> .
Если опущено, <реляционная связь> рассматривается как одна секция.
matchBy (Необязательно) Предложение MATCHBY(), содержащее столбцы, определяющие сопоставление данных и определение текущей строки.
reset (Необязательно) Доступно только в визуальных вычислениях. Указывает, сбрасывается ли вычисление и на каком уровне иерархии столбцов визуальной фигуры. Допустимые значения: NONE, LOWESTPARENT, HIGHESTPARENT или целое число. Поведение зависит от целочисленного знака:
если ноль или опущено, вычисление не сбрасывается. Эквивалент NONE.
— Если положительный, целое число определяет столбец, начиная с самого высокого, независимо от зерна. САМЫЙ ВЫСОКИЙ УРОВЕНЬ ЭКВИВАЛЕНТЕН 1.
— Если отрицательное, целое число определяет столбец, начиная с самого низкого, относительно текущего зерна. САМЫЙ НИЗКИЙPARENT эквивалентен -1.

Возвращаемое значение

Одна или несколько строк из <реляционного отношения>.

Замечания

За исключением столбцов, добавленных функциями таблицы DAX, каждый столбец в <отношении>, если совпадениеBy> отсутствует, или каждый столбец в <matchBy> и <partitionBy>, при <<наличии сопоставленияBy> должен иметь соответствующее внешнее значение, чтобы помочь определить текущую строку, в которой следует работать, с помощью следующего поведения:

  • Если есть ровно один соответствующий внешний столбец, используется его значение.
  • Если соответствующий внешний столбец отсутствует, то:
    • OFFSET сначала определяет все столбцы, у которых нет соответствующего внешнего столбца.
    • Для каждого сочетания существующих значений для этих столбцов в родительском контексте OFFSET вычисляется смещение и возвращается строка.
    • Окончательные выходные данные OFFSET — это объединение этих строк.
  • Если существует несколько соответствующих внешних столбцов, возвращается ошибка.

Если все <столбцы отношения> были добавлены функциями таблицы DAX, возвращается ошибка.

Если <значение matchBy> присутствует, OFFSET попытается использовать <столбцы matchBy> и <partitionBy> для идентификации строки.
Если <matchBy> отсутствует, и столбцы, указанные в <orderBy> и <partitionBy> , не могут однозначно идентифицировать каждую строку в <отношении>, а затем:

  • OFFSET попытается найти наименьшее количество дополнительных столбцов, необходимых для уникальной идентификации каждой строки.
  • Если такие столбцы можно найти, OFFSET автоматически добавит эти новые столбцы в <порядок,> и каждая секция сортируется с помощью этого нового набора столбцов OrderBy.
  • Если такие столбцы не удается найти, возвращается ошибка.

Если возвращается пустая таблица:

  • Соответствующее внешнее значение столбца OrderBy или PartitionBy не существует в <отношении>.
  • Разностное <> значение приводит к перемещению в строку, которая не существует в разделе.

Если OFFSET используется в вычисляемом столбце, определенном в той же таблице, что <и отношение>, и <orderBy> опущен, возвращается ошибка.

<сброс> можно использовать только в визуальных вычислениях и не может использоваться в сочетании с <orderBy> или <partitionBy>. Если <сброс> присутствует, ось> может быть указана, <но <связь> не может быть указана.

Пример 1— вычисляемый столбец

Следующий запрос DAX:

DEFINE
VAR vRelation = SUMMARIZECOLUMNS ( 
                    DimProductCategory[EnglishProductCategoryName], 
                    DimDate[CalendarYear], 
                    "CurrentYearSales", SUM(FactInternetSales[SalesAmount]) 
                  )
EVALUATE
ADDCOLUMNS (
    vRelation, 
    "PreviousYearSales", 
    SELECTCOLUMNS(
        OFFSET ( 
                -1, 
                vRelation, 
                ORDERBY([CalendarYear]), 
                PARTITIONBY([EnglishProductCategoryName])
        ),
        [CurrentYearSales]
    )
)

Возвращает таблицу, которая суммирует общий объем продаж для каждой категории продукта и календарного года, а также общий объем продаж для этой категории в предыдущем году.

Пример 2. Мера

Следующий запрос DAX:

DEFINE
MEASURE DimProduct[CurrentYearSales] = SUM(FactInternetSales[SalesAmount])
MEASURE DimProduct[PreviousYearSales] = CALCULATE(SUM(FactInternetSales[SalesAmount]), OFFSET(-1, , ORDERBY(DimDate[CalendarYear])))
EVALUATE
SUMMARIZECOLUMNS (
    DimDate[CalendarYear],
    "CurrentYearSales", DimProduct[CurrentYearSales],
    "PreviousYearSales", DimProduct[PreviousYearSales]
)

Использует OFFSET() в мере для возврата таблицы, которая суммирует общий объем продаж за каждый календарный год и общий объем продаж за предыдущий год.

Пример 3. Вычисляемый столбец

Следующий запрос DAX:

EVALUATE
ADDCOLUMNS (
    FactInternetSales,
    "Previous Sales Amount",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                FactInternetSales,
                ORDERBY ( FactInternetSales[SalesAmount], DESC ),
                PARTITIONBY ( FactInternetSales[ProductKey] ),
                MATCHBY( FactInternetSales[SalesOrderNumber], FactInternetSales[SalesOrderLineNumber] )
            ),
            FactInternetSales[SalesAmount]
        )
)

Возвращает таблицу FactInternetSales с добавлением столбца, указывающего, для каждой продажи, суммы предыдущей продажи одного и того же продукта в порядке убывания объема продаж, при этом текущая продажа определяется его SalesOrderNumber и SalesOrderLineNumber. Без MATCHBY запрос вернет ошибку, так как в таблице FactInternetSales отсутствуют ключевые столбцы.

Пример 4. Визуальное вычисление

Следующий запрос DAX визуального вычисления:

SalesRelativeToPreviousMonth = [SalesAmount] - CALCULATE(SUM([SalesAmount]), OFFSET(-1, ROWS, HIGHESTPARENT))

Возвращает разницу в общем объеме продаж между каждым месяцем и предыдущим в течение одного года.

Снимок экрана ниже: визуальная матрица и выражение визуального вычисления:

Вычисление визуального элемента DAX

INDEX
ORDERBY
PARTITIONBY
MATCHBY
WINDOW
RANK
ROWNUMBER