从数据到信息
从信息到洞察

理解自动匹配 Auto-Exists

什么是 Auto-Exists

Auto-Exists 使查询结果只显示现有属性的组合。以超市销售数据为例,在电器类目下显示空调的销售数量是有意义的,显示衬衫是无意义的,因为电器类目下没有衬衫这个 SKU。虽然类目和产品来自不同的列,但是 Auto-Exists 确保两者不会出现错配,只包含现有的属性组合。

触发条件

Auto-Exists 是 SSAS 的一项功能,在所有运行 DAX 或者 MDX 的客户端都能观察到它的存在。当同一个表的两个或多个列被同时筛选时,Auto-Exists 机制就会发挥作用。

理解 Auto-Exists

让我们以下图中的数据模型为例来理解 Auto-Exists。

在这个模型中,产品类别列和子类别列的排列既采用了规范化也采用了反规范化

在模型中,产品、子类别和类别之间存在筛选关系。利用 RELATED 函数,我们还在产品表中添加了反规范化的产品类别和子类别。

Product 表原本不存在红框中的两列,通过 RELATED 我们将产品类别和产品子类别进行了反规范化,现在它们都在产品表中新建了副本。

基于此模型,你可以轻松构建两个数据透视表,显示按类别和子类别划分的销售额。乍一看,他们的结果是相同的

两种模型的展示结果相同

实际上,DAX 以两种不同的方式计算两个透视表,其实是由于两个不同特性作用于标准查询才提供了相同的结果。它们是自动匹配(Auto-Exists)和移除空行(Empty Row Removal)。Auto-Exists 是服务器特性,而移除空行是透视表特性。让我们来更详细地分析一下它们。

  • 反规范化模型使用 Auto-Exists 避免对不存在的集合进行计算。事实上,虽然计算(Audio, MP4&MP3)组合的销售额是有意义的,但是为(Audio, Camcorders)组合进行相同的计算是没有意义的,因为摄像机这个子类别根本不属于音频类别。因此,由于没有同时属于摄像机和音频的产品,DAX 完全可以避免计算这个值,从而减少报表的整体计算时间。
  • 规范化模型使用移除空行达到与 Auto-Exists 相同的效果,这是透视表默认启用的特性,如果当前行所有度量值都为空,它会自动隐藏该行。例如,如果有一个产品从来没有被卖出过,那么透视表就会隐藏它,因为这一行不会包含任何有用的信息。

认识移除空行

移除空行位置示意

需要再次强调的是,Auto-Exists 是服务器特性,而移除空行是透视表特性。你可以通过在透视表选项中选择“显示行中的空数据项”复选框来控制移除空行的行为;通过这种方式,你可以禁用移除空行,此时两个表的结果将产生显著区别,如下图所示。

禁用透视表的移除空行,将使两表显示不同的结果

自动匹配与移除空行的内在区别

如果禁用移除空行规范化模型会对不存在的类别与子类别组合执行计算。另一方面,在反规范化模型中,只对现有组合进行计算。反规范化模型以不同方式运行的原因是由于 Auto-Exists。右侧透视表的两列属于同一个表,所以引擎第一步先确定现有的组合,然后才计算有效值。在 DAX 中,通过以下两个查询模拟,你会注意到这种差异:

------------- 规范化模型 -------------
EVALUATE
ADDCOLUMNS (
    CROSSJOIN (
        VALUES ( 'Product Category'[Category] ),
        VALUES ( 'Product Subcategory'[Subcategory] )
    ),
    "Sales Amount", [Sales Amount]
)

------------ 反规范化模型 -------------
EVALUATE
SUMMARIZECOLUMNS (
    'Product Category'[Category],
    'Product Subcategory'[Subcategory],
    "Sales Amount", [Sales Amount]
)

第一个查询使用 CROSSJOIN,返回不存在的类别和子类别组合,第二个查询使用 SUMMARIZE 只返回存在的组合。

Power BI 中的 Auto-Exists

虽然 Power BI 不提供 Excel 移除空行的特性,但会在查询中隐式加入判断当前维度组合行数的度量值,来实现同样的效果,所以即使作为维度的列来自不同的表,Power BI 也默认只显示存在的组合:

矩阵只保留了源数据中存在的组合

用来生成的矩阵的查询

Auto-Exists 的潜在影响

到目前为止,这种差异看起来很微妙,似乎无伤大雅。实际上,当你开始编写修改筛选上下文的度量值,在 CALCULATE 中加入筛选器参数时,Auto-Exists 就变得非常重要。如果你不理解这种行为,很可能会认为公式出了 Bug。

本文隐藏内容查看价格为5G币,请先
单独购买的内容长期有效,不受时间限制(购买前先刷新当前页面)。加入VIP会员可享受全站权益,性价比更高。

结合数据模型一文中的另一个相似案例,希望这两个案例可以帮助你理解 Auto-Exists,它们可能不是很常见,但在某些情况下是理解问题的关键。

总结

Auto-Exists 减少了无效计算,大部分情况下,这是我们希望的效果,但是为了严谨起见,我们还需要进一步厘清它的发生场景:标准的做法是将 Auto-Exists 转移到维度表,而不是在宽表中。

本文隐藏内容查看价格为5G币,请先
单独购买的内容长期有效,不受时间限制(购买前先刷新当前页面)。加入VIP会员可享受全站权益,性价比更高。

14
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
8 评论数
7 被回复的评论
9 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
成员
jb870610

“Auto-Exists 是 SSAS 的一项功能,在所有运行 DAX 或者 MDX 的客户端都能观察到它的存在。当同一个表的两个或多个列被同时筛选时,Auto-Exists 机制就会发挥作用。”高老师,问一下,如果分别在普通的数据透视表和powerpivot创建的数据透视表里面,行和列字段都放同一张表的不同列,会不会出现自动匹配啊?如果不会,是怎么保证透视表里只显示现有属性的组合的?

1.png
成员
做一名学霸

这里创建的是度量值,DAX公式没有行上下文,为什么不报错?我记得之前讲过计值上下文时,提到:记住,列本身没有值,相反,它对于表中每行都有不同的值。因此如果想要单个值就需要指定所用的行。指定计算所用行的唯一方式是使用行上下文,因为在这个度量值内部不存在行上下文,所以该公式是不正确的,将不予接受。
而截图的CALCULATE第一参数直接是一个列,如果没有行上下文,那应该会报错才对呀。我用POWER PIVOT书写,就会报错

Snipaste_2023-01-19_14-33-32.png
Snipaste_2023-01-19_14-37-32.png
成员
小本本

这篇文章中的”引擎将类别和子类别的组合作为筛选器” 这段话, 意思是形成复杂筛选吗? 如果不是的化, 和复杂筛选挺像的, 有啥区别呢?

组合筛选 (小).png
成员
ArcSaber

看了全文,有两个问题:
1. 请问nomalized model和denormalized model的定义是什么?
2. 可以把如何生成的说一下吗?
谢谢

成员
CatCatLa

“当 DAX 计算组合的值时,它遵循 CALCULATE 计值流,用 Audio 替代当前类别,从而得到的组合,后者可以被有效计算并显示在透视表中。”,老师你好,这里我不理解为什么CAL会用audio替换当前类别,在哪个章节有解释CAL发生这个行为的计值流吗?

成员
奇缘

努力学习,这一节,我就记住反正使用星型模型了。但是为什么对于规范化模型结果却错了,反规范化宽表却是正确的还是不明白。 笑哭

成员
bbzhdlp

高老师,这个规范化和反规范化,没太明白,这两个透视表,是从哪个表里拉的Row Lables?

234.png
DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数