powerbi - 评估此 Filter(All(Column),...) 语法时真正发生了什么?
问题描述
我的 PowerBI Desktop 模型中只有一个名为“Data”的表,其中包含 [Datetime]、[Type]、[Name] 和其他几列。
我通过单击图表选择特定的 Type="B",并在 Datetime 上使用切片器选择一段时间,然后使用下面的度量来计算 Type "A" 中有多少不同的名称(如预期的那样,有不应该同时有 A 和 B 的记录)。那时我对结果完全感到困惑:
(我的 PowerBI 版本是 2019 年 4 月的最新版本。)
Wrong =
CALCULATE (
DISTINCTCOUNT ( Data[Name] ),
FILTER ( ALL ( Data[Type] ), Data[Type] = "A" )
)
虽然这一措施被证明是正确的:
Correct =
CALCULATE (
DISTINCTCOUNT ( Data[Name] ),
FILTER ( Data, Data[Type] = "A" )
)
我认为正在发生的事情(可能错过了一些重要的事情):
由于这两个度量在外部共享相同的显式过滤器上下文CALCULATE
,并且它们最终计算的内容相同,因此唯一的问题是“最终提供的上下文是什么FILTER
”?
使用正确的版本,FILTER
只需获取 (Type="B" + Datetime) 子集,尝试在子集 (Type="B" + Type="A" + Datetime) 中查找类型为“A”的行,它只是失败。所以FILTER
最终计算没有给出任何结果,结果如预期的那样是空白的(当我选择 B 型时应该没有 A 型记录)。
使用错误的版本,FILTER
(只有一列)忽略类型(最初是“B”)上的所有过滤器上下文,然后它应用一个新的(Type="A")来替换原来的。而且由于每一列都是单独过滤的,所以 Datetime 上的过滤器根本不会改变。所以最终的上下文CALCULATE
应该是一个子集,同时包含类型“A”和选择的时间段(类型=“A”+日期时间),这使得最终结果“类型A的不同名称的数量期间”,和我当初选择的Type无关。
但问题是,根据它给出的奇怪结果,[Wrong]
它绝对不是我所想的,我对此一无所知。我已经尝试了很多我认为合理的方法来测试它是如何工作的,但他们只是失败了......
感谢您的任何建议!
我制作了一个很小的 pbix 文件进行测试(具有相同的结构和问题): https : //pan.baidu.com/s/1gNZDNlICFLkMdPpPArb8cQ 如果需要,使用 yf7f 下载它。
解决方案
该FILTER
函数将表作为其第一个参数。此表在您正在操作的过滤器上下文中进行评估。
在该Correct
版本中,这意味着当您传入 时,Data
该表会根据您的切片器选择进行过滤。然后添加条件,该条件不适用于过滤集中的任何内容,因为您已经选择了该类型。因此,它返回空白,因为表是空的。Type = "B"
Datetime
Data[Type] = "A"
Data
"B"
编辑:划掉我之前说的内容,然后看一个例子。以此作为一个完整的表开始:
Name Type Datetime
Alex A 1/3/2019
Alex A 1/4/2019
Bob A 1/5/2019
Bob B 1/5/2019
Bob A 1/7/2019
Carla B 1/3/2019
Carla B 1/4/2019
Dan A 1/6/2019
B
如果我对 type和 dates进行切片1/3/2019 - 1/5/2019
,则剩下的行如下:
Name Type Datetime
Bob B 1/5/2019
Carla B 1/3/2019
Carla B 1/4/2019
当我们ALL( Data[Type] )
在此上下文中计算时,我们会得到下表,这与删除Type
切片器但保留日期切片器相同:
Name Type Datetime
Alex A 1/3/2019
Alex A 1/4/2019
Bob A 1/5/2019
Bob B 1/5/2019
Carla B 1/3/2019
Carla B 1/4/2019
现在,当您添加Data[Type] = "A"
条件时,您将获得此表,这与您最初过滤A
而不是B
(并保留日期切片器)相同,您将获得以下内容:
Name Type Datetime
Alex A 1/3/2019
Alex A 1/4/2019
Bob A 1/5/2019
这显然有两个不同的名称,而不是没有。在该Correct
版本中,不同之处在于您A
在上面的第二个表格而不是第三个表格中过滤类型。
基本上,ALL
撤消您使用切片器选择的类型选择。
注意:我之前所说的间接影响事物并不是这里发生的事情。当您进行从行上下文到过滤上下文的上下文转换时,这是一个问题,但不适用于此处。对困惑感到抱歉。
推荐阅读
- highcharts - highstock:当系列与 sma 相交时如何更改区域样条中的颜色
- java-9 - GluonVM、源代码和 JDK 兼容性
- python - 如何检查记录器是否存在
- sql - INSERT SELECT FOR UPDATE ON CONFLICT DO NOTING RETURNING 的语义
- spring - spring mvc登录表单验证
- javascript - 如何在不使用 scaleTime 的情况下使用 d3 v4 创建多折线图?
- c# - 如何使用 Await 方法加载新页面
- javascript - .#datepicker 不工作是错误和图标没有被点击?
- jboss - jboss中的套接字超时为7.1.1
- github - GitHub 是否关闭了对 Subversion 客户端的支持?