过滤器未按预期工作.我在某个查询上得到错误的结果



new here。我在power BI中导入了一个基本的excel。有两列。日期和结果。结果不是好就是坏。我构建了一个函数,用于检查自上次糟糕的一天以来有多少(工作)天是好的。虽然我有两个函数是有效的,我想知道为什么一个不起作用。这个不行:

>Measure =
CALCULATE (
COUNT ( Table[Date] )
,Table[Result] = "Good"
,FILTER (
Table
,Table[Date] > CALCULATE ( 
MAX ( Table[Date] )
,Table[Result] = "bad" 
)
)
) + 0

这显然会计算每一个好日子,而不会过滤掉最后一个坏日子。

这些工作:

>Measure =
CALCULATE (
COUNT ( Table[Date] )
,Table[Result] = "Good"
,FILTER (
Table
,Table[Date]> CALCULATE(
MAX (Table[Date])
,Table
,Table[Result] = "bad" 
)
)
) + 0

>Measure =
CALCULATE (
COUNT ( Table[Date] )
,Table[Result] = "Good"
,FILTER(
Table
,Table[Date]> CALCULATE(
MAX(Table[Date])
,FILTER(
Table
,Table[Result] = "bad" 
)
)
)
) + 0

谁能解释一下第一个"错"在哪里?提前感谢!

这是一个关于DAX如何工作的好问题。因此,实际上,这涉及到计算()表达式之间的区别。父FILTER()逐行遍历每一行,比较当前行中某个列的值是否满足过滤条件。同时,CALCULATE()在所谓的行上下文中对每一行进行计算(请阅读相关内容)。当CALCULATE()使用每行中的值作为过滤器([Result]和[Date])时,它是一个行上下文。

那么,这个表达式:

CALCULATE(              
MAX(Table[Date])
,Table[Result] = "bad" 
)

等于

CALCULATE(              
MAX(Table[Date])
,FILTER(
,ALL(Table[Result]) -- open the table with al "RESULT" type
,Table[Result] = "bad" -- filters opened table by "bad"
)
,Table[Date] = Table[Date] -- (value in the current row) this filter 
-- is added by CALCULATE() automaticaly 
-- due to a row context mode
)

你总是有一个[Date]过滤器。如果在当前行中有"bad";你得到一个值,如果有" good "你一无所有。这就是你如何排除"坏"()并拥有所有"好"的方法。例如,在[Date]=20 Jun 2022; [Result]="bad"行中,CALCULATE()将返回"2022年6月20日",然后比较[Date](="20 Jun 2022")>"20 Jun 2022",返回FALSE()和行排除。然后你有[Date]=21 Jun 2022; [Result]="good",CALCULTE()返回BLANK()。[Date](="21 Jun 2022")>BLANK()返回TRUE(),行保留在表中。

为什么这个计算工作(见下文)?

CALCULATE(              
MAX(Table[Date])
,Table
,Table[Result] = "bad" 
)

等于:

CALCULATE(              
MAX(Table[Date])
,ALL(Table)
,FILTER(
,ALL(Table[Result])
,Table[Result] = "bad"
)
)    

首先工作ALL(表),根据DAX规则。它删除了所有过滤器,所有行上下文都见鬼去了,您可以按原样处理表。然后使用"bad"

如果有不清楚的地方,请问。如果没有,请标记答案。

您的DAX结构有问题。你需要一步一步的去遵循最佳综合实践像在代码中使用变量:

请测试这些DAX代码:版本1:

VAR MaxDate_With_Bad = CALCULATE(MAX(Table[Date]),Table[Result] = "bad")
VAR Filtered_Table = FILTER ( Table, Table[Date] > MaxDate_With_Bad)
VAR Result = 
CALCULATE ( COUNT ( Table[Date] ), Table[Result] = "Good", Filtered_Table)
RETURN Result

版本2:

VAR MaxDate_With_Bad = CALCULATE(MAX(Table[Date]),Table[Result] = "bad")
VAR Filtered_Table = FILTER ( ALL(Table), Table[Date] > MaxDate_With_Bad)
VAR Result = 
COUNTROWS(
CALCULATETABLE(
Filtered_Table,
Table[Result] = "Good"
)
)
RETURN Result

最新更新