INDEX

适用于:计算列计算表度量值视觉对象计算

在指定分区(按指定顺序排序)的绝对位置(由位置参数指定)处返回一行。 如果当前分区无法推导为单个分区,则可能会返回多个行。

语法

INDEX(<position>[, <relation> or <axis>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>][, <reset>] )

parameters

术语 定义
position 从中获取数据的绝对位置(从 1 开始):
- <position> 为正:1 为第一行,2 为第二行,以此类推。
- <position> 为负:-1 为最后一行,-2 为倒数第二行,以此类推。
当 <position> 超过边界、为零或 BLANK() 时,INDEX 将返回一个空表。 它可以是任何返回标量值的 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。

返回值

处于绝对位置的行。

备注

每个 <partitionBy> 和 <matchBy> 列都必须具有相应的外部值,帮助定义要操作的“当前分区”,其行为如下:

  • 如果正好有一个对应的外部列,则使用其值。
  • 如果没有对应的外部列:
    • INDEX 将首先确定没有对应外部列的所有 <partitionBy> 和 <matchBy> 列。
    • 对于 INDEX 的父上下文中这些列的现有值的每个组合,将计算 INDEX 并返回一行。
    • INDEX 的最终输出是这些行的并集。
  • 如果有多个对应的外部列,则会返回错误。

如果存在 <matchBy>,INDEX 将尝试使用 <matchBy> 和 <partitionBy> 列来标识行。
如果不存在 <matchBy>,<orderBy> 和 <partitionBy> 中指定的列无法唯一地标识 <relation> 中的每一行:

  • INDEX 将尝试查找唯一地标识每行所需的最少数量的附加列。
  • 如果可以找到这种列,INDEX 会自动将这些新列追加到 <orderBy>,并且每个分区都使用这组新的 OrderBy 列进行排序。
  • 如果找不到这种列,则返回错误。

在以下情况下,将返回一个空表:

  • PartitionBy 列的相应外部值不存在于 <relation> 中。
  • <position> 值指代了分区中不存在的位置。

如果在与 <relation> 相同的表上定义的计算列中使用 INDEX,并且省略了 <orderBy>,则会返回错误。

<reset>只能用于视觉对象计算,不能与 <orderBy> 或 <partitionBy> 结合使用。 如果存在 <reset>,则可以指定 <axis>,但不能指定 <relation>。

示例 1 - 计算列

以下 DAX 查询:

EVALUATE INDEX(1, ALL(DimDate[CalendarYear]))

返回下表:

DimDate[CalendarYear]
2005

示例 2 - 计算列

以下 DAX 查询:

EVALUATE
SUMMARIZECOLUMNS (
    FactInternetSales[ProductKey],
    DimDate[MonthNumberOfYear],
    FILTER (
            VALUES(FactInternetSales[ProductKey]),
            [ProductKey] < 222
    ),
    "CurrentSales", SUM(FactInternetSales[SalesAmount]),
    "LastMonthSales",
    CALCULATE (
        SUM(FactInternetSales[SalesAmount]),
        INDEX(-1, ORDERBY(DimDate[MonthNumberOfYear]))
    )
)
ORDER BY [ProductKey], [MonthNumberOfYear]

返回下表:

FactInternetSales[ProductKey] DimDate[MonthNumberOfYear] [CurrentSales] [LastMonthSales]
214 1 5423.45 8047.7
214 2 4968.58 8047.7
214 3 5598.4 8047.7
214 4 5073.55 8047.7
214 5 5248.5 8047.7
214 6 7487.86 8047.7
214 7 7382.89 8047.7
214 8 6543.13 8047.7
214 9 6788.06 8047.7
214 10 6858.04 8047.7
214 11 8607.54 8047.7
214 12 8047.7 8047.7
217 1 5353.47 7767.78
217 2 4268.78 7767.78
217 3 5773.35 7767.78
217 4 5738.36 7767.78
217 5 6158.24 7767.78
217 6 6998 7767.78
217 7 5563.41 7767.78
217 8 5913.31 7767.78
217 9 5913.31 7767.78
217 10 6823.05 7767.78
217 11 6683.09 7767.78
217 12 7767.78 7767.78

示例 3 - 视觉计算

以下视觉计算 DAX 查询:

SalesComparedToBeginningOfYear = [SalesAmount] - CALCULATE(SUM([SalesAmount]), INDEX(1, ROWS, HIGHESTPARENT))

SalesComparedToBeginningOfQuarter = [SalesAmount] - CALCULATE(SUM([SalesAmount]), INDEX(1, , -1))

增强表,使其包含每个月的:
- 总销售额;
- 与相应年份第一个月的差异;
- 与相应季度第一个月的差异。

以下屏幕截图显示了视觉对象矩阵和第一个视觉计算表达式:

DAX 视觉计算

OFFSET
ORDERBY
PARTITIONBY
WINDOW
RANK
ROWNUMBER