You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DAX中FILTER函数括号对逻辑运算的影响及结果差异原因

关于DAX过滤条件中括号影响结果的问题

我需要编写DAX代码计算公司备件的最新使用日期,要求满足以下两个条件:

  • SP_USED[Product Number] 等于 "92360122" 或 "92360136"
  • 对应的SP_USED[Model Number (Adjusted)] 为 "XN-10"、"XN-20"、"XN-31" 或 "XR-10"

错误的代码(Code 1)

这段代码未按预期过滤数据,返回的是所有行的最大值,而非符合条件的行的最大值:

LUsedDateCombined = 
VAR currIB = SP_USED[Install Base]
VAR maxDateLastUsed = 
CALCULATE(
    MAX(SP_USED[BRB Start Date]),
    FILTER(
        SP_USED,
        SP_USED[Product Number] = "92360122" || SP_USED[Product Number] = "92360136" &&
            
            SP_USED[Model Number (Adjusted)] = "XN-10" ||
            SP_USED[Model Number (Adjusted)] = "XN-20" ||
            SP_USED[Model Number (Adjusted)] = "XN-31" ||
            SP_USED[Model Number (Adjusted)] = "XR-10" ||
            SP_USED[Model Number (Adjusted)] = "XR-10"
        
    ),
    SP_USED[Install Base] = currIB 
)
RETURN
FORMAT(maxDateLastUsed, "dd/mm/yyyy")

正确的代码(Code 2)

给型号条件添加括号后,代码返回了符合过滤条件的最大值:

LUsedDateCombined (Joanne) = 
VAR currIB = SP_USED[Install Base]
VAR maxDateLastUsed = 
CALCULATE(
    MAX(SP_USED[BRB Start Date]),
    FILTER(
        SP_USED,
        SP_USED[Product Number] = "92360122" || SP_USED[Product Number] = "92360136" &&
            
            (SP_USED[Model Number (Adjusted)] = "XN-10" ||
            SP_USED[Model Number (Adjusted)] = "XN-20" ||
            SP_USED[Model Number (Adjusted)] = "XN-31" ||
            SP_USED[Model Number (Adjusted)] = "XR-10" ||
            SP_USED[Model Number (Adjusted)] = "XR-10")
        
    ),
    SP_USED[Install Base] = currIB 
)
RETURN
FORMAT(maxDateLastUsed, "dd/mm/yyyy")

差异原因分析

核心问题在于DAX逻辑运算符的优先级:&&(逻辑与)的优先级高于||(逻辑或),DAX会先执行所有&&运算,再执行||运算。

Code 1的实际执行逻辑

没有括号的情况下,条件会被DAX自动解析为:

SP_USED[Product Number] = "92360122" 
|| 
(SP_USED[Product Number] = "92360136" && SP_USED[Model Number (Adjusted)] = "XN-10")
|| 
SP_USED[Model Number (Adjusted)] = "XN-20"
|| 
SP_USED[Model Number (Adjusted)] = "XN-31"
|| 
SP_USED[Model Number (Adjusted)] = "XR-10"

这意味着只要型号是XN-20、XN-31或XR-10,无论产品编号是什么,都会被纳入计算范围,最终返回的是所有符合型号条件的行的最大日期,自然不符合预期。

Code 2的实际执行逻辑

给型号的||组添加括号后,强制DAX先计算括号内的型号条件,再与产品编号的&&结合,最终逻辑变为:

SP_USED[Product Number] = "92360122" 
|| 
(
    SP_USED[Product Number] = "92360136" 
    && 
    (SP_USED[Model Number (Adjusted)] = "XN-10" || ... || "XR-10")
)

这就实现了预期的过滤逻辑:要么产品编号是92360122,要么产品编号是92360136且型号符合指定范围。

为何调整产品编号括号仍错误

如果给产品编号条件加括号、去掉型号条件的括号,比如写成:

(SP_USED[Product Number] = "92360122" || SP_USED[Product Number] = "92360136") && 
SP_USED[Model Number (Adjusted)] = "XN-10" || 
SP_USED[Model Number (Adjusted)] = "XN-20" || ...

DAX依然会先执行&&运算,最终逻辑变为:

((Product=A || Product=B) && Model=C) || Model=D || Model=E || Model=F

这还是会把型号为XN-20、XN-31、XR-10的所有行纳入计算,结果自然错误。

内容的提问来源于stack exchange,提问作者Joanne Jeow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:50:33