数据沿袭实际上存在DAX中的每个角落,它的设计如此好,以至于很多开发人员在不知情的情况使用。
DAX使用数据沿袭来维护关于列值来源的信息。数据沿袭实际上是一个标签(Tag),分配给表中的每一列,此Tag用于标识数据模型中的原始列,即列的值源自于该列。通过数据沿袭,DAX可以利用现有的关系来过滤数据模型。
对列的简单引用会保留数据沿袭,对列执行运算会破坏数据沿袭。
1,对列的简单引用会保留数据沿袭
例如,以下查询返回 Product 表中的不同类别:
EVALUATE VALUES ( 'Product'[Category] )
VALUES 返回的表包含 8 个字符串,然而,它们不仅仅是字符串,DAX还知道这些字符串源自 Product[Category] 列。作为 Product 表的沿袭,它们继承了Product可以通过关系传播来过滤数据模型中其他表的能力,这就是在迭代函数中迭代VALUES ( Product[Category] ) ,创建的行上下文能够转换为过滤 Sales 表的原因。
考虑以下查询,通过把行上下文转换为筛选上下文,计算每个Categoyr的销售额。VALUES函数返回的表之所以能够和Sales表进行关联,原因就是VALUES函数会保持数据沿袭,这使得Product和Sales之间的关系不变。
EVALUATE
ADDCOLUMNS (
VALUES ( 'Product'[Category] ),
"Amt", [Sales Amount]
)
2,数据沿袭跟列名和内容无关,仅跟原始列有关系
举个例子,使用DATATABLE创建一个静态表Category,该表和Sales之间没有任何关系,这使得列值“Audio”本身无法过滤 Sales,可以通过运行以下查询轻松检查这一点:
EVALUATE
VAR Categories =
DATATABLE (
"Category", STRING,
{
{ "Category" },
{ "Audio" },
{ "TV and Video" },
{ "Computers" },
{ "Cameras and camcorders" },
{ "Cell phones" },
{ "Music, Movies and Audio Books