[知识体系] 理解 TREATAS

  [复制链接]
查看225251 | 回复172 | 2021-2-21 18:56:39 | 显示全部楼层 |阅读模式
TREATAS 函数是无关系情况下执行查找匹配的最佳选择,它通过映射数据沿袭的方式使无关系筛选成为可能,了解 TREATAS,你需要先了解关于数据沿袭的知识。

了解数据沿袭(Data Linage)

任何表函数都包含一个或多个列,每个列都具有特定的沿袭当一个列对应于数据模型的一个物理列时,引擎可以识别这种沿袭关系,从而可以更快地进行筛选操作。沿袭不取决于列的名称,从技术上讲,它是可以唯一标识列的内部标准。你无法通过 DAX 显示列的沿袭,但可以观察这种效果。


例如,观察下面这个由两个颜色值组成的度量值将始终得到总销售额,因为这个CALCULATE 筛选器参数的完整语法是出于演示目的)。我们只需要一个条件就能筛选 Product[Color]:

  1. Test :=
  2. CALCULATE (
  3.     [Sales Amount],
  4.     FILTER ( ALL ( 'Product'[Color] ), 'Product'[Color] IN { "Red", "Blue" } )
  5. )
复制代码

数据沿袭的工作流

数据沿袭的工作流程是这样的:ALL 返回一个包含所有产品颜色的表,包含来自原始列的值,因此 DAX 知道每个值的含义。FILTER 扫描包含所有颜色的表,并检查每个颜色是否包含在由红色和蓝色组成的匿名表中。最终,FILTER 返回一个包含 Product[Color]值的表,因此 CALCULATE 知道筛选应用于 Product[Color]列。

你可以将数据沿袭想象为添加到每个列的特殊标记,目的是标识列在数据模型中的位置。

一般来说你不必专门考虑数据沿袭,因为 DAX 以一种自然和直观的方式处理这背后的复杂性。例如,当表中的值被分配给变量,那么此变量在后续整个 DAX 计值过程中都将具有该表的数据沿袭信息。


学习数据沿袭之所以重要,是因为我们经常需要根据不同的场景保持或更改数据沿袭。在某些场景中,保持数据沿袭非常重要,而在另外一些场景中,可能需要更改某些列的沿袭。

理解数据沿袭 Data Lineage在DAX中,数据沿袭是一个标记(Tag)。表的每一列都会分配这样一个标记,它的作用是标识数据模型中的原始列。沿袭不取决于列的名称,也不取决列的值,从技术上讲,它是可以唯一标识列的内部标准。你无法通过DAX显示列的沿袭,但可以观察这种效果。


理解 TREATAS

将来自第一参数的列视为来自其他表的列,并继承它们的数据沿袭,对于每一列,TREATAS 剔除其在各自的输出列中不存在的值。

  1. TREATAS ( <Expression>, <ColumnName>, [ <ColumnName>, [ … ] ] )
复制代码


TREATAS 将<ColumnName>的数据沿袭分配给<Expression>中对应的列。你可以将结果作为变量在后续表达式中调用,因为 TREATAS 不是 CALCULATE 调节器。另外,它的第一参数必须是表表达式。


下面这个公式计算红色和蓝色产品的销售额,第一参数使用了匿名表:

  1. Test :=
  2. CALCULATE ( [Sales Amount],
  3.             TREATAS ( { "Red", "Blue" }, 'Product'[Color] )
  4. )
复制代码


TREATAS 返回一个继承 Product[Color]列沿袭的表,表中标记了第一参数列出的值。 因此,这个新版本的测试度量值只筛选红色和蓝色,如图所示。


7099211936391.png

TREATAS 更新了匿名表的沿袭,因此筛选器可以正常工作

多参数 TREATAS

你可以将 TREATAS 用于两列或多列的情况,第一参数中的列按顺序与后面的列一一对应。公式写法如下

  1. [Filtered Measure] :=
  2. CALCULATE (
  3.     <target_measure>,
  4.     TREATAS (
  5.         SUMMARIZE (
  6.             <lookup_table>
  7.             <lookup_granularity_column_1>
  8.             <lookup_granularity_column_2>
  9.         ),
  10.         <target_granularity_column_1>,
  11.         <target_granularity_column_2>
  12.     )
  13. )
复制代码

注意事项

1. TREATAS 的第一参数必须是表表达式,TREATAS 的结果可以赋值给变量,因为 TREATAS 不是 CALCULATE 调节器


2. TREATAS 将第二参数的数据沿袭赋给表达式返回的列,使其可以筛选模型。虽然没加任何参数,但第二参数隐式使用了 ALL,以确保不被外层上下文影响。如果需要使外部筛选上下文可以筛选 TREATAS,可以配合 KEEPFILTERS 使用。


3. 如果第一参数中返回的值在列中不存在,将会被忽略。例如:

  1. TREATAS({"Red"、"Green"、"Yellow"},DimProduct[Color])
复制代码


公式在 DimProduct[Color]上设置一个筛选器,其中有三个值 Red、Green 和 Yellow。如果 DimProduct[Color]中不存在“黄色”,则有效筛选值为“红色”和“绿色”。


4. Excel 在 Excel 2016 的 1809 版本之后开始支持 TREATAS 函数,但智能感知可能无法识别,你需要完整的写出函数。

DAX 虚拟关系筛选方法总结
了解虚拟关系

筛选上下文从一个表传输到另一个表,虚线关系都属于实体关系,而虚拟关系不可见,通过映射数据沿袭的方式生效。[/quote]

有三种函数可以实现虚拟筛选,它们分别是 FILTER_CONTAINS、INTERSECT、TREATAS

FILTER+CONTAINS:通用公式
  1. [Filtered Measure] :=
  2. CALCULATE (
  3.     <target_measure>,
  4.     FILTER (
  5.         ALL ( <target_granularity_column> ),
  6.         CONTAINS (
  7.             VALUES ( <lookup_granularity_column> ),
  8.             <lookup_granularity_column>,
  9.             <target_granularity_column>
  10.         )
  11.     )
  12. )
复制代码

INTERSECT:适用于 Excel 2016,SSAS Tabular 2016 及之后的版本
  1. [Intersect Measure] :=
  2. CALCULATE (
  3.     <target_measure>,
  4.     INTERSECT (
  5.         ALL ( <target_granularity_column> ),
  6.         VALUES ( <lookup_granularity_column> )
  7.     )
  8. )
复制代码

TREATAS:适用于 Power BI 和最新的 SSAS Tabular
  1. [Filtered Measure] :=
  2. CALCULATE (
  3.     <target_measure>,
  4.     TREATAS (
  5.         VALUES ( <lookup_granularity_column> ),
  6.         <target_granularity_column>
  7.     )
  8. )
复制代码


如果你习惯了 INTERSECT 模式,可能会发现 TREATAS 语法很奇怪,因为 TREATAS 必须反转参数:第一参数是要读取的筛选上下文,第二个参数包含起筛选作用的列

总结



本文介绍了很多虚拟关系筛选的方式,但物理关系始终是你的首选,因为物理关系下的公式计算效率最高

  • 首选物理关系
  • 不能使用物理关系的情况下,使用 TREATAS 创建虚拟关系
  • 当 TREATAS 不可用时,使用 INTERSECT 创建虚拟关系
  • 当 TREATAS 和 INTERSECT 都不可用时,使用 FILTER+CONTAINS 创建虚拟关系

如果你使用 Power BI Desktop 和较新的 SSAS Tabular 版本,会发现某些情况下 TREATAS 的性能表现和物理关系接近甚至更好,这得益于新版本引擎的优化,但这种表现不具有普遍性,实际性能仍然需要以实测为准。另外,如果使用老版本的 DAX 引擎,比如 Power BI Report Server,你无法观察到优化带来的性能提升

回复

使用道具 举报

lwtlm | 2021-4-24 15:06:55 来自手机 | 显示全部楼层
占位编辑
回复

使用道具 举报

冷无情 | 2021-5-24 11:18:46 | 显示全部楼层
前排,哇咔咔
回复

使用道具 举报

corolla | 2021-7-2 12:27:21 | 显示全部楼层
LZ帖子不给力,勉强给回复下吧
回复

使用道具 举报

CrossK | 2021-9-19 20:37:19 来自手机 | 显示全部楼层
锄禾日当午,发帖真辛苦。谁知坛中餐,帖帖皆辛苦!
回复

使用道具 举报

longhorn | 2021-10-6 09:15:32 | 显示全部楼层
呵呵,低调,低调!
回复

使用道具 举报

zhouqh | 2021-10-15 13:02:16 来自手机 | 显示全部楼层
我了个去,顶了
回复

使用道具 举报

小芒果 | 2021-10-15 18:42:13 来自手机 | 显示全部楼层
支持一下,天天来这学习
回复

使用道具 举报

蕉爸爸 | 2021-10-19 17:52:31 来自手机 | 显示全部楼层
好帖必须得顶起
回复

使用道具 举报

车行天下 | 2021-10-25 19:13:53 | 显示全部楼层
我也是坐沙发的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则