如何将生成PreserveVal列的Excel条件逻辑转换为DAX公式?
将Excel OFFSET逻辑转换为DAX公式
需求明确
现有数据表包含两列:
Index:从0开始的连续整数索引Val:值为0或连续递增的正整数
需要计算PreserveVal列,规则如下:
- 若当前行
Val=0:- 未处于某个
Val>0行的后续4行屏蔽期内时,返回0 - 处于屏蔽期内时,返回空
- 未处于某个
- 若当前行
Val>0:- 当前行是触发屏蔽的起始行时,返回
Val - 处于之前某行的屏蔽期内时,返回空
- 当前行是触发屏蔽的起始行时,返回
- 触发
Val>0后,强制后续连续4行进入屏蔽期(无论这4行的Val是什么),屏蔽期结束后重新执行规则
DAX计算列公式
PreserveVal = VAR CurrentIndex = [Index] VAR CurrentVal = [Val] -- 找到当前行处于其屏蔽期内的最近触发行(Val>0且屏蔽结束索引≥当前索引) VAR ActiveTrigger = CALCULATE( MAX([Index]), FILTER( ALL('Table'), [Val] > 0 && [Index] + 4 >= CurrentIndex ) ) RETURN IF( CurrentVal = 0, -- Val为0时,判断是否在屏蔽期内 IF(NOT(ISBLANK(ActiveTrigger)) && CurrentIndex > ActiveTrigger, BLANK(), 0), -- Val>0时,判断是否为触发行本身 IF(CurrentIndex = ActiveTrigger, CurrentVal, BLANK()) )
公式解释
变量定义:
CurrentIndex/CurrentVal:缓存当前行的索引和值,简化后续逻辑引用ActiveTrigger:筛选出所有满足“Val>0且屏蔽结束索引(当前索引+4)≥当前行索引”的行,取其中最大的索引,即当前行所处屏蔽期的起始触发行
逻辑分支:
- 当
Val=0:如果存在有效触发行且当前行在其屏蔽期内(当前索引>触发行索引),返回空;否则返回0 - 当
Val>0:如果当前行就是触发行,返回Val;否则处于之前触发行的屏蔽期,返回空
- 当
注意事项
- 确保
Index列是连续无间隙的0起始整数,否则屏蔽期的范围计算会失效 - 若需要保留其他维度的筛选上下文,可将
ALL('Table')替换为ALLEXCEPT('Table', [筛选维度列]) - DAX中的
BLANK()对应Excel中的空单元格,若需要返回空字符串,可替换为""
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

