OFFSET
返回一个行,该行位于同一表中的当前行之前或之后(按给定的偏移量)。 如果当前行无法推导为单行,则可能返回多行。
语法
OFFSET ( <delta>[, <relation> or <axis>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>][, <reset>] )
parameters
术语 | 定义 |
---|---|
delta | 从中获取数据的当前行之前(负值)或之后(正值)的行数。 它可以是任何返回标量值的 DAX 表达式。 |
relation | (可选)从中返回输出行的表表达式。 如果指定,<partitionBy> 中的所有列都必须来自它或相关表。 如果省略: - 必须显式指定 <orderBy>。 - 所有 <orderBy> 和 <partitionBy> 表达式必须是完全限定的列名称,并且来自单个表。 - <orderBy> 和 <partitionBy> 中的所有列都默认为 ALLSELECTED()。 |
轴 | (可选)视觉形状中的轴。 仅在视觉计算中可用,并替换 <relation>。 |
orderBy | (可选)包含用于定义每个分区排序方式的表达式的 ORDERBY() 子句。 如果省略: - 必须显式指定 <relation>。 - 默认为按 <relation> 中尚未在 <partitionBy> 中指定的每个列排序。 |
空白 | (可选)定义排序时如何处理空白值的枚举。 此参数留待将来使用。 目前,唯一支持的值为 DEFAULT,其中数值的行为是空白值在零和负值之间排序。 字符串的行为是空白值排列在所有字符串(包括空字符串)之前。 |
partitionBy | (可选)包含用于定义 <relation> 分区方式的列的 PARTITIONBY() 子句。 如果省略,则 <relation> 会被视为单个分区。 |
matchBy | (可选)包含用于定义如何匹配数据和标识当前行的列的 MATCHBY() 子句。 |
reset | (可选)仅在视觉计算中可用。 指示计算是否重置,以及处于视觉形状的列层次结构的哪个级别。 接受的值为:NONE、LOWESTPARENT、HIGHESTPARENT 或整数。 此行为取决于整数符号: - 如果为零或省略,则计算不会重置。 等效于 NONE。 - 如果为正值,则整数标识从最高开始的列、与粒度无关。 HIGHESTPARENT 等效于 1。 - 如果为负值,则整数标识相对于当前粒度从最低开始的列。 LOWESTPARENT 等效于 -1。 |
返回值
<relation> 中的一行或多行。
备注
除 DAX 表函数添加的列外,<relation> 中的各列(不存在 <matchBy> 时),或 <matchBy> 和 <partitionBy> 中的各列(存在 <matchBy> 时)都必须具有相应的外部值,以帮助定义要操作的当前行,行为如下:
- 如果正好有一个对应的外部列,则使用其值。
- 如果没有对应的外部列,则:
- OFFSET 将首先确定没有对应外部列的所有列。
- 对于 OFFSET 的父上下文中这些列的现有值的每个组合,将计算 OFFSET 并返回一行。
- OFFSET 的最终输出是这些行的并集。
- 如果有多个对应的外部列,则会返回错误。
如果 DAX 表函数添加了 <relation> 的所有列,则返回错误。
如果存在 <matchBy>,OFFSET 将尝试使用 <matchBy> 和 <partitionBy> 列来标识行。
如果不存在 <matchBy>,<orderBy> 和 <partitionBy> 中指定的列无法唯一地标识 <relation> 中的每一行,则:
- OFFSET 将尝试查找唯一地标识每行所需的最少数量的附加列。
- 如果可以找到这种列,OFFSET 会自动将这些新列追加到 <orderBy>,并且每个分区都使用这组新的 OrderBy 列进行排序。
- 如果找不到这种列,则返回错误。
在以下情况下,将返回一个空表:
- OrderBy 或 PartitionBy 列的相应外部值不存在于 <relation> 中。
- <delta> 值会导致切换到分区中不存在的行。
如果在与 <relation> 相同的表上定义的计算列中使用 OFFSET,并且省略了 <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))
返回同一年内每个月与前一个月之间的总销售额差异。
下面的屏幕截图显示了视觉矩阵和视觉计算表达式: