使用DAX创建从首个非零值开始计数、ID变更时重置的计算列
DAX 计算列实现方案
前置要求
你的表必须有可确定行先后顺序的唯一字段(比如自增ID、数据创建时间戳等,下文统称该字段为RowID,数值随你示例的行顺序递增),DAX没有表默认存储顺序的概念,无排序字段无法实现该逻辑。
计算列代码
把代码里的你的表名替换为你实际的表名即可:
index = VAR CurrentID = [id] VAR CurrentRow = [RowID] // 定位当前ID分组下第一个occurence非零的行位置 VAR FirstNonZeroPos = MINX( FILTER( '你的表名', '你的表名'[id] = CurrentID && '你的表名'[occurence] <> 0 ), [RowID] ) RETURN IF( CurrentRow < FirstNonZeroPos || ISBLANK(FirstNonZeroPos), 0, CurrentRow - FirstNonZeroPos + 1 )
逻辑说明
- 变量先固定当前行的ID和排序值,避免上下文切换导致取值错误
- 筛选同ID下所有occurence不为0的行,取最小的排序值作为计数的起始锚点
- 当前行位置早于锚点、或当前ID全为0没有锚点时返回0,否则用行号差计算连续计数,ID变更时会自动匹配新ID的锚点重新计数
- 你之前用RANKX未得到正确结果,核心是没有先定位计数锚点,且RANKX按值排序的逻辑无法匹配行顺序要求
结果验证
代入你给出的示例数据,A1分组首个非零行的排序值为3,对应行返回1,后续行依次+1;A2分组首个非零行排序值为7,对应返回1,后续依次+1,完全匹配你给出的index列结果。
内容的提问来源于stack exchange,提问作者zyzz
相关产品推荐
相关产品推荐

