CALCULATE
如果我们在有和没有FILTER功能的情况下使用它,那么函数结果有什么不同.假设我们有这两个措施:
Measure1 = CALCULATE([X], 'FactTable'[Color]="Red")
Measure2 = CALCULATE([X], FILTER('FactTable', 'FactTable'[Color]="Red")
Run Code Online (Sandbox Code Playgroud)
更新.额外的赏金问题:
有没有办法通过使用其他函数来修改Measure2,例如ALL
,或者ALLSELECTED
,它会返回与Measure1完全相同的结果?
赏金后更新
我决定给予赏金以获得与我接受的答案不同的答案.
不仅结果,而且两种措施获得这些结果的方式也不尽相同.
我创建了两个与您的示例类似的度量来测试它:
TestAvgNoFilter = CALCULATE([PrcAvg]; cal[ReadDate]=DATE(2018;05;23))
TestAvgFilter = CALCULATE([PrcAvg]; filter(cal; cal[ReadDate]=DATE(2018;05;23)))
Run Code Online (Sandbox Code Playgroud)
当我简单地将它们都放入数据透视表而没有任何额外的字段或切片器时,当然它们都显示相同的结果:
然而:
使用FILTER
具有显着的性能影响,可以清楚地看到查询计划和存储引擎与公式引擎的利用率.它创建了额外的临时表,它需要与来自报表/数据透视表本身(行,列,切片器)的现有过滤器"交互".您不会注意到单个单元格中的简单平均值,但如果您的[x]度量本身很复杂并且有许多"初始"过滤器,则计算时间的差异可能很大.
FILTER
使用初始过滤器上下文保留和迭代,而直接使用的过滤器表达式CALCULATE
忽略它.看看当我将ReadDate添加到数据透视表时会发生什么:
这正是为什么没有FILTER
更快的度量:它不关心列中的日期 - 它已经计算了一个"真实"值,而度量与FILTER
每行的初始过滤器进行评估.
两列中的结果都可以认为是正确的 - 它实际上取决于解释以及如何命名度量;).
作为一般规则,我建议你不必使用FILTER
.在真正需要时节省它的力量.
这里的区别是CALCULATE
允许简单的过滤器来替换现有的过滤器上下文。在您的示例中,CALCULATE
将使用现有的过滤器上下文计算度量[X]
,不同之处在于它会删除任何现有的过滤器上下文FactTable[Color]
并将其替换为FactTable[Color] = Red.
该FILTER
函数是一个迭代器,这意味着它一次一行地遍历表(作为第一个参数传入),并计算每行的表达式(第二个参数)。FILTER
当中有一个函数时CALCULATE
,它会将现有的过滤器上下文与 的结果结合起来FILTER
(而不是像简单的过滤器参数一样替换它)。
一般来说,只要有选择,您就希望使用简单的过滤器,因为计算会更有效。但是,那FILTER
函数允许您执行更复杂的过滤,因此在简单过滤器不够的情况下它仍然非常有用。
进一步阅读:FILTER() \xe2\x80\x93 何时、为何以及如何使用它
\n