如果我们在使用和不使用FILTER函数的情况下使用它,那么CALCULATE
函数的结果会有什么不同。假设我们有这两个措施:
Measure1 = CALCULATE([X], 'FactTable'[Color]="Red")
Measure2 = CALCULATE([X], FILTER('FactTable', 'FactTable'[Color]="Red")
更新。额外的赏金问题:
有没有办法通过使用其他函数来修改 Measure2 ,例如ALL
或ALLSELECTED
,这样它将返回与 Measure1 >完全相同的结果
赏金后更新
我决定给予赏金以获得与我接受的答案不同的答案。
答案 0 :(得分:9)
不仅结果,而且两种措施获得这些结果的方式也不尽相同。
我创建了两个与您的示例类似的度量来测试它:
TestAvgNoFilter = CALCULATE([PrcAvg]; cal[ReadDate]=DATE(2018;05;23))
TestAvgFilter = CALCULATE([PrcAvg]; filter(cal; cal[ReadDate]=DATE(2018;05;23)))
当我简单地将它们都放入数据透视表而没有任何额外的字段或切片器时,当然它们都显示相同的结果:
但是:
使用FILTER
会对性能产生重大影响,可以清楚地看到查询计划和存储引擎与公式引擎的利用率。它创建了额外的临时表,它需要"交互"已有的过滤器来自报告/数据透视表本身(行,列,切片器)。你不会注意到单个单元格中的简单平均值,但是如果你的[x]度量本身很复杂并且有许多" initial"过滤器,计算时间的差异可能很大。
FILTER
保留并迭代初始过滤器上下文,而直接在CALCULATE
中使用的过滤器表达式忽略它。当我将ReadDate添加到数据透视表时,看看会发生什么:
这正是没有FILTER
的措施更快的原因:它并不关心列中的日期 - 它已经计算了一个" true"值,而FILTER
的度量值针对每行的初始过滤器进行评估。
两列中的结果都可以认为是正确的 - 它实际上取决于解释以及如何命名度量;)。
作为一般规则,我建议您在不必要的时候不要使用FILTER
。在它真正需要的时候保存它的力量。
答案 1 :(得分:3)
这里的区别在于CALCULATE
允许使用简单的过滤器来替换现有的过滤器上下文。在您的示例中,CALCULATE
将使用现有的过滤器上下文计算度量[X]
,但它会删除FactTable[Color]
的任何现有过滤器上下文并将其替换为FactTable[Color] = Red.
FILTER
函数是一个迭代器,这意味着它一次一行地遍历表(作为第一个参数传入),并为每一行计算表达式(第二个参数)。如果FILTER
内有CALCULATE
函数,它会将现有的过滤器上下文与FILTER
的结果组合在一起(而不是像简单的过滤器参数那样替换它)。
通常,只要您有选择,就希望使用简单的过滤器,因为计算效率会更高。但是,FILTER
函数允许您执行更复杂的过滤,因此在简单过滤器不够的情况下它仍然非常有用。
答案 2 :(得分:1)
DAX生成的自动FILTER函数的DAX语法代替逻辑表达式要求您在过滤器表达式中表示单个列。我们来看这个例子 -
Measure1 = CALCULATE([X], 'FactTable'[Color]="Red")
上面的语法在内部转换为以下语法,您可以用显式方式编写,从DAX度量中获取相同的行为。
Measure1 = CALCULATE([X], FILTER(ALL('FactTable'[Color]), 'FactTable'[Color]="Red"))
因此,如果在Measure2值中使用last函数,它将获取相同的结果。
答案 3 :(得分:0)
您创建的度量将具有相同的输出,因为您只传递一个值以过滤为颜色"红色"。
但是如果你想传递值的范围(比如日期范围)来过滤, Measure1 会不会起作用,因为它无法做到这一点,因为它只传递单个值来过滤。< / p>
在 Measure2 中,您可以使用特定表格和列中的FILTER函数传递特定值的范围,以获得所需的输出。
Measure2 = CALCULATE([X], FILTER('FactTable', 'FactTable'[Color])
您可以使用FILTER减少正在使用的表中的行数,并在计算中仅使用特定数据。
您可以在此处找到有关FILTER功能的更多详细信息及其工作原理 -
https://msdn.microsoft.com/en-us/query-bi/dax/filter-function-dax