Power BI自定义列引用自身前值:Value C计算实现问询
解决方案:在Power BI中实现按月重置的累积乘积列(Value C)
这个需求完全可行,不需要直接引用正在创建的列,利用DAX的迭代函数和分组筛选就能实现。以下是具体的实现方式和逻辑:
核心思路
因为Value B是每月从1开始递增的工作日计数,我们可以基于这个序号,对每个月内的工作日进行分组,计算从当月第一个工作日到当前行的Value A累积乘积——这正好匹配你的需求:
- 当月首个工作日(Value B=1):累积乘积就是自身的
Value A - 后续工作日:累积乘积 = 当前
Value A× 上一行的Value C(本质是之前所有Value A的乘积 × 当前Value A)
具体DAX公式
创建计算列Value C,使用以下公式:
Value C = VAR CurrentMonth = EOMONTH('Table'[Date], 0) VAR CurrentWorkdaySeq = 'Table'[Value B] -- 筛选当月所有序号小于等于当前行的工作日记录 VAR MonthWorkdaysToCurrent = FILTER( ALL('Table'), EOMONTH('Table'[Date], 0) = CurrentMonth && 'Table'[Value B] <= CurrentWorkdaySeq && 'Table'[Value B] <> BLANK() // 排除非工作日行 ) RETURN -- 计算筛选范围内Value A的累积乘积 PRODUCTX(MonthWorkdaysToCurrent, 'Table'[Value A])
公式逻辑说明
CurrentMonth:用EOMONTH获取当前行日期所属月份的最后一天,用于分组筛选当月数据。MonthWorkdaysToCurrent:筛选出当前月份内,所有Value B序号小于等于当前行的工作日记录(排除非工作日的空值行)。PRODUCTX:迭代筛选后的记录,计算所有Value A的乘积——这就是你需要的Value C:- 当
Value B=1时,筛选结果只有当前行,乘积就是自身的Value A - 当
Value B>1时,筛选结果包含从当月第一个工作日到当前行的所有记录,乘积等价于“上一行Value C × 当前Value A”
- 当
优化说明
如果你的表格数据量较大,可以考虑添加日期表并建立关系,用日期表的月份字段替代EOMONTH计算,提升公式性能。另外,如果需要处理非工作日的Value C(比如继承前一个工作日的值),可以在RETURN部分添加条件判断,例如:
RETURN IF( 'Table'[Value B] = BLANK(), -- 非工作日:取上一个工作日的Value C CALCULATE( LASTNONBLANK('Table'[Value C], 1), FILTER(ALL('Table'), 'Table'[Date] < 'Table'[Date] && 'Table'[Value B] <> BLANK()) ), PRODUCTX(MonthWorkdaysToCurrent, 'Table'[Value A]) )
内容的提问来源于stack exchange,提问作者Matheus Assumpção Solinho
相关产品推荐
相关产品推荐

