DAX度量值Test1与Test2计数结果差异及等效性疑问
1. 核心问题:度量值引用错误
你创建的Date Selected是度量值,引用度量值时不需要添加表名前缀,正确写法是[Date Selected],而非MachineData[Date Selected]。错误的引用方式触发了Power BI的隐式上下文转换,直接导致计算逻辑偏离预期。
2. 两个度量值的实际计算逻辑
Test1的正确逻辑
Test1 = COUNTROWS(FILTER(MachineData, MachineData[StartTime] >= Max(MachineData[StartTime]) - 31 ))
这里的Max(MachineData[StartTime])是在全局筛选上下文(切片器选中的日期范围)下计算的,取的是切片器筛选后MachineData表中StartTime的最大值。因此Test1统计的是:切片器范围内,StartTime大于等于「筛选后最大值 -31天」的行数(也就是你预期的最近31天数据量,结果3800)。
Test2的错误逻辑
Test2 = COUNTROWS(FILTER(MachineData, MachineData[StartTime] >= MachineData[Date Selected] - 31))
由于你用MachineData[Date Selected]引用度量值,Power BI会将其视为在FILTER的行上下文中计算该度量值。每迭代一行MachineData时,行上下文会限制当前仅包含这一行数据,此时MAX(MachineData[StartTime])(即Date Selected的核心逻辑)返回的就是当前行的StartTime值。
最终Test2的条件实际变成:MachineData[StartTime] >= 当前行StartTime -31,这个条件对所有行都成立(日期减31天必然小于等于自身),因此COUNTROWS返回的是整个MachineData表的总行数(结果18000)。
3. 修正后的Test2
将MachineData[Date Selected]改为[Date Selected],Test2的逻辑就会和Test1完全一致:
Test2 = COUNTROWS(FILTER(MachineData, MachineData[StartTime] >= [Date Selected] - 31))
此时[Date Selected]取全局筛选上下文的最大值,两个度量值的结果将完全相同。
内容的提问来源于stack exchange,提问作者Sam

