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

如何将生成PreserveVal列的Excel条件逻辑转换为DAX公式?

将Excel OFFSET逻辑转换为DAX公式

需求明确

现有数据表包含两列:

  • Index:从0开始的连续整数索引
  • Val:值为0或连续递增的正整数

需要计算PreserveVal列,规则如下:

  1. 若当前行Val=0:
    • 未处于某个Val>0行的后续4行屏蔽期内时,返回0
    • 处于屏蔽期内时,返回空
  2. 若当前行Val>0:
    • 当前行是触发屏蔽的起始行时,返回Val
    • 处于之前某行的屏蔽期内时,返回空
  3. 触发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())
    )

公式解释

  1. 变量定义:

    • CurrentIndex/CurrentVal:缓存当前行的索引和值,简化后续逻辑引用
    • ActiveTrigger:筛选出所有满足“Val>0且屏蔽结束索引(当前索引+4)≥当前行索引”的行,取其中最大的索引,即当前行所处屏蔽期的起始触发行
  2. 逻辑分支:

    • 当Val=0:如果存在有效触发行且当前行在其屏蔽期内(当前索引>触发行索引),返回空;否则返回0
    • 当Val>0:如果当前行就是触发行,返回Val;否则处于之前触发行的屏蔽期,返回空

注意事项

  • 确保Index列是连续无间隙的0起始整数,否则屏蔽期的范围计算会失效
  • 若需要保留其他维度的筛选上下文,可将ALL('Table')替换为ALLEXCEPT('Table', [筛选维度列])
  • DAX中的BLANK()对应Excel中的空单元格,若需要返回空字符串,可替换为""

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:24:30