首页 > 解决方案 > 带和不带 FILTER 的 DAX 计算函数

问题描述

CALCULATE如果我们使用和不使用 FILTER 函数,函数的结果有什么区别。假设我们有这两个措施:

Measure1 = CALCULATE([X], 'FactTable'[Color]="Red")

Measure2 = CALCULATE([X], FILTER('FactTable', 'FactTable'[Color]="Red")

更新

有没有办法通过使用其他函数来修改Measure2,例如ALL或,以便它返回与Measure1ALLSELECTED完全相同的结果?

标签: powerbidax

解决方案


不仅结果,而且两种措施获得这些结果的方式也不相同。

我创建了两个类似于您的示例的度量来测试这一点:

TestAvgNoFilter = CALCULATE([PrcAvg]; cal[ReadDate]=DATE(2018;05;23))
TestAvgFilter = CALCULATE([PrcAvg]; filter(cal; cal[ReadDate]=DATE(2018;05;23)))

当我只是将它们都放入数据透视表而不使用任何其他字段或切片器时,它们当然都显示相同的结果:

图1

然而:

  1. 使用FILTER具有显着的性能影响,可以清楚地看到查询计划和存储引擎与公式引擎的利用率。它创建了额外的临时表,它需要与来自报告/数据透视表本身(行、列、切片器)的现有过滤器“交互”。您不会注意到单个单元格中的简单平均值,但如果您的 [x] 度量本身很复杂并且有许多“初始”过滤器,则计算时间的差异可能会很大。

  2. FILTER保留和迭代初始过滤器上下文,而直接使用的过滤器表达式CALCULATE忽略它。看看当我将 ReadDate 添加到数据透视表时会发生什么:

图2

这正是没有的度量FILTER更快的原因:它不关心列中的日期 - 它已经计算了一个“真实”值,而具有的度量FILTER根据每一行的初始过滤器评估自身。

两列中的结果都可以被认为是正确的 - 这实际上完全取决于解释以及您如何命名度量;)。

作为一般规则,我建议您在不需要FILTER时不要使用。在真正需要的时候省电。


推荐阅读