OFFSET
применяется:вычисляемый столбец
вычисляемой таблицы
измерение
визуального вычисления
Возвращает одну строку, расположенную либо до, либо после текущей строки в той же таблице, с помощью заданного смещения. Если текущая строка не может быть выведена в одну строку, может быть возвращено несколько строк.
Синтаксис
OFFSET ( <delta>[, <relation> or <axis>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>][, <reset>] )
Параметры
Срок | Определение |
---|---|
delta |
Число строк до (отрицательное значение) или после (положительное значение) текущей строки, из которой необходимо получить данные. Это может быть любое выражение DAX, возвращающее скалярное значение. |
relation |
(Необязательно) Табличное выражение, из которого возвращается выходная строка.
Если указано, все столбцы в partitionBy должны поступать из нее или связанной таблицы.
Если опущено: - orderBy необходимо явно указать.. Все выражения orderBy и partitionBy должны быть полными именами столбцов и поступать из одной таблицы.
— по умолчанию ALLSELECTED() всех столбцов в orderBy и partitionBy . |
axis |
(Необязательно) Ось в визуальной форме. Доступно только в визуальных вычислениях и заменяет relation . |
orderBy |
(Необязательно) Предложение ORDERBY(), содержащее выражения, определяющие порядок сортировки каждой секции.
Если опущено: - relation необходимо явно указать.
— по умолчанию упорядочивается по каждому столбцу в relation , который еще не указан в partitionBy . |
blanks |
(Необязательно) Перечисление, определяющее, как обрабатывать пустые значения при сортировке relation или axis .
Поддерживаемые значения:
Примечание. Если параметр blanks и пустые значения в функции ORDERBY() для отдельных выражений указываются, blanks для отдельного выражения orderBy имеет приоритет для соответствующего выражения orderBy, а выражения orderBy без blanks заданы будут учитывать параметр blanks родительской функции. |
partitionBy |
(Необязательно) Предложение PARTITIONBY(), содержащее столбцы, определяющие секционирование relation . Если опущено, relation рассматривается как одна секция. |
matchBy |
(Необязательно) Предложение MATCHBY(), содержащее столбцы, определяющие сопоставление данных и определение текущей строки. |
reset |
(Необязательно) Доступно только в визуальных вычислениях. Указывает, сбрасывается ли вычисление и на каком уровне иерархии столбцов визуальной фигуры. Допустимые значения: ссылка на поле столбца в текущей визуальной форме, NONE (по умолчанию), LOWESTPARENT , HIGHESTPARENT или целое число. Поведение зависит от целочисленного знака: — если нулевая или опущенная, вычисление не сбрасывается. Эквивалентно NONE .
— если положительный, целое число определяет столбец, начиная с самого высокого, независимо от зерна. HIGHESTPARENT эквивалентно 1.
— если отрицательно, целое число определяет столбец, начиная с самого низкого, относительно текущего зерна. LOWESTPARENT эквивалентно -1. |
Возвращаемое значение
Одна или несколько строк из relation
.
Замечания
За исключением столбцов, добавленных DAX табличными функциями, каждый столбец в relation
, если matchBy
отсутствует, или каждый столбец в matchBy
и partitionBy
, если matchBy
присутствует, должен иметь соответствующее внешнее значение, чтобы помочь определить текущую строку, в которой следует работать, с помощью следующего поведения:
- Если есть ровно один соответствующий внешний столбец, используется его значение.
- Если соответствующий внешний столбец отсутствует, то:
- OFFSET сначала определит все столбцы, у которых нет соответствующего внешнего столбца.
- Для каждого сочетания существующих значений для этих столбцов в родительском контексте OFFSETвычисляется OFFSET и возвращается строка.
- OFFSETконечные выходные данные являются объединением этих строк.
- Если существует несколько соответствующих внешних столбцов, возвращается ошибка.
Если все столбцы relation
были добавлены DAX табличными функциями, возвращается ошибка.
Если matchBy
присутствует, OFFSET попытается использовать matchBy
и partitionBy
столбцы для идентификации строки.
Если matchBy
отсутствует, и столбцы, указанные в orderBy
и partitionBy
, не могут однозначно идентифицировать каждую строку в relation
, а затем:
- OFFSET попытается найти наименьшее количество дополнительных столбцов, необходимых для уникальной идентификации каждой строки.
- Если такие столбцы можно найти, OFFSET автоматически добавит эти новые столбцы в
orderBy
, и каждая секция сортируется с помощью этого нового набора столбцов OrderBy. - Если такие столбцы не удается найти, возвращается ошибка.
Если возвращается пустая таблица:
- Соответствующее внешнее значение столбца OrderBy или PartitionBy не существует в
relation
. - Значение
delta
приводит к переходу к строке, которая не существует в разделе.
Если OFFSET используется в вычисляемом столбце, определенном в той же таблице, что и relation
, и orderBy
опущен, возвращается ошибка.
reset
можно использовать только в визуальных вычислениях и не может использоваться в сочетании с orderBy
или partitionBy
. Если reset
присутствует, axis
можно указать, но relation
невозможно.
Пример 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))
Возвращает разницу в общем объеме продаж между каждым месяцем и предыдущим в течение одного года.
Снимок экрана ниже: визуальная матрица и выражение визуального вычисления: