前言
在2024年10月,PowerBI更新了一个名为“值筛选行为”的功能,目的是为了修复Auto-Exists机制中的Bug。但由于海量的报表已经运行在这个Bug的基础之上,影响范围过大,且Bug的行为相对稳定可重复,已经逐渐演变成了一个特殊的特性,所以官方决定不直接修复这个Bug,而是提供了名为“值筛选行为”的功能来间接修复。
通过“值筛选行为”功能,用户可以以手工切换的方式来自行决定是否要继续沿用这个Bug特性,还是采用另一种修复后的计值流程。
目前,“值筛选行为”功能总共有三个选项可用,可以在模型视图的属性窗格中进行更改,如下图所示:
这三个选项的含义如下:
-
Automatic(自动) :这是默认选项,该选项目前等价于 ‘Coalesced‘ 选项,也即保留了Auto-Exists机制的传统计值流程的行为。注意:当”值筛选行为“功能结束预览时,设置为 ‘Automatic‘ 选项的新模型将使用 ‘Independent‘ 选项的行为。
-
Independent(独立) :关闭Auto-Exists机制,不再过滤无效的筛选器组合。
-
Coalesced(合并) :启用Auto-Exists机制,将过滤无效的筛选器组合,也即目前的传统计值流程。
由于”值筛选行为“功能会影响模型的计值流程,所以开发报表时,最好选定了一个选项后就不要再更改了,否则可能会导致度量值等表达式的计值流程发生变更,从而导致计算结果出现错误。
“值筛选行为”的计值流程
“值筛选行为”功能虽然有三个选项,但其实只有独立和合并这两种计值流程,而且这两种计值流程的区分也很简单,分别代表Auto-Exists机制的关闭与开启。
由于在之前的文章中已经详细介绍过Auto-Exists机制及其Bug特性,并给出了该Bug特性在不同场景下的计值流程,所以本篇文章中将只介绍“值筛选行为”为 ‘Independent(独立)’ 时的计值流程。关于“值筛选行为”为 ‘Coalesced(合并)’ 时的传统计值流程请参考下面的两篇文章:
- 理解自动匹配(Auto-Exists) : https://www.ximaple.com/posts/911.html
- PowerBI中度量值所处的计值环境研究:https://www.ximaple.com/posts/913.html
“值筛选行为”为 ‘Independent(独立)’ 时的计值流程如下:
-
首先,若视觉对象存在轴字段,则将对轴字段生成的笛卡尔积组合进行过滤,依次将每个组合作为筛选器并与报表环境中的其他初始筛选器进行相交,然后检测轴字段对应的基础表是否存在可见数据,若不存在可见数据,则该组合将被剔除,最后视觉对象的轴字段将只剩下那些能够筛选得到数据的组合。
-
最后,将报表环境中的所有初始筛选器进行相交,然后作为度量值的计值环境。注意:切片器、视觉对象的轴字段、图表联动、视觉筛选器等所有初始筛选器都进行相交,无论是否相同列上的筛选器均进行相交。
下面对第一个步骤稍微解释一下。如下图所示,矩阵的行标签使用了产品类别和产品名称两个字段,那么它们生成的完整笛卡尔积组合将如右边的矩阵所示,但由于产品类别切片器只选择了电脑外设和手机配件这两个类别,所以矩阵行标签生成的笛卡尔积中的含有智能设备类别下的产品的组合在作为筛选器与其进行相交时是筛选不到数据的,所以最终矩阵行标签中含有智能设备类别下的产品的组合都被剔除了。因此,无论度量值的表达式是什么,在这些被剔除了的组合中都不会显示值,相当于这些组合被物理删除了,所以无法通过更改计值环境的方式让其显示出内容。
这个行为是不是很熟悉?其实这就是对矩阵行标签进行了一次Auto-Exists。虽然“值筛选行为”已经设置为 ‘Independent(独立)’,将关闭Auto-Exists机制,但考虑到性能优化以及用户的直观感受(一个类别下不应该出现其他类别的产品),官方还是保留了对视觉对象的轴字段执行Auto-Exists的行为。除此之外,其他会触发Auto-Exists机制的地方都会被关闭。
辅助理解的例子
下面通过一个案例,来理解“值筛选行为”设置为 ‘Independent(独立)’后的计值流程。
首先,这是“值筛选行为”设置为自动或合并时的结果,如下图所示:
以矩阵第一行为例,此时的计值流程如下:
由于“值筛选行为”设置为自动或合并时,发生了Auto-Exists,使得产品类别为电脑外设的筛选器组合都被过滤掉了,所以最后移除产品名称的筛选器后就只剩下手机配件这一个产品类别了,因此最终返回产品类别为手机配件的销售额。
然后作为对比,再将“值筛选行为”设置为独立,其结果如下图所示:
仍然以矩阵第一行为例,此时的计值流程如下:
此时,由于“值筛选行为”设置为独立,Auto-Exists机制被关闭,因此不会过滤任何筛选器组合。所以最后移除产品名称的筛选器后,产品类别筛选器仍然筛选电脑外设和手机配件,因此最终返回产品类别为电脑外设和手机配件的总销售额。
总结
虽然Auto-Exists机制的Bug特性比较稳定,且经过研究后已经得出了适用于绝大部分场景的计值流程。但是这毕竟是一个Bug,难免会遇到无法解释的场景,所以建议在新报表中最好还是把值筛选行为设置为独立,以使用修复Bug后的更简单易懂的计值流程。
但是在一些模型基数大且对性能有要求的场景中,可能将值筛选行为设置为合并会更好一点,因为这样可以借助Auto-Exists机制来减少无效的筛选器组合,从而提高计算效率。