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

Power BI DAX中基于前一行的递归度量值实现方案问询

在Power BI中实现What-if分析的递归月末计算(DAX解决方案)

一、推导非递归通项公式

你的递归公式可先简化:
原公式:N_end_of_month = 上月月末值 + 上月月末值*(Base_Rate/12) + 上月月末值*(Bonus_Rate/12) + Net Incoming
合并费率项后,设月度综合增长率 r = (Base_Rate + Bonus_Rate)/12,公式简化为:
Nₜ = Nₜ₋₁*(1 + r) + Iₜ
其中:

  • Nₜ = 第t个月末的结果值
  • N₀ = 初始期初值(可设为What-if参数)
  • Iₜ = 第t月的Net Incoming(由自定义参数计算得出)

通过线性递推数列求解,非递归通项公式为:
Nₜ = N₀*(1+r)ᵗ + Σ(Iₖ*(1+r)ᵗ⁻ᵏ) (k从1到t)
该公式可直接用DAX实现,无需递归,性能更优。

二、DAX具体实现方案

(一)非递归方案(推荐)

前置准备

  1. 确保有连续的日期表,标记为Power BI日期表,添加月份序号列(比如从1开始对应第1个月,或包含0作为期初)。
  2. 创建所需What-if参数:Base_Rate、Bonus_Rate、初始值N0,以及计算Net Incoming的相关参数(或直接定义Net Incoming度量值)。

编写度量值

首先定义月度增长率:

月度综合增长率 = (Base_Rate[Base_Rate Value] + Bonus_Rate[Bonus_Rate Value])/12

然后编写核心月末值度量值:

月末值_非递归 = 
VAR r = [月度综合增长率]
VAR 初始值 = Initial_Value[Initial_Value Value]
VAR 当前月份序号 = MAX('日期表'[月份序号])
-- 计算初始值的复利累计
VAR 初始复利部分 = 初始值 * POWER(1 + r, 当前月份序号)
-- 计算每个月Net Incoming的加权复利和(后续月份的流入会复利增长)
VAR 流入加权部分 = 
SUMX(
    FILTER(ALL('日期表'), '日期表'[月份序号] <= 当前月份序号),
    [Net Incoming] * POWER(1 + r, 当前月份序号 - '日期表'[月份序号])
)
RETURN
初始复利部分 + 流入加权部分

(二)递归方案(适用于复杂场景)

若需严格遵循递归逻辑,可编写递归度量值,注意设置终止条件:

月末值_递归 = 
VAR 当前月份序号 = MAX('日期表'[月份序号])
VAR r = [月度综合增长率]
VAR 初始值 = Initial_Value[Initial_Value Value]
-- 终止条件:第0个月(期初)返回初始值
IF(
    当前月份序号 = 0,
    初始值,
    -- 递归计算上月月末值,加上本月的复利收益和当月流入
    CALCULATE([月末值_递归], '日期表'[月份序号] = 当前月份序号 - 1) * (1 + r) + [Net Incoming]
)

关键注意事项

  • 日期表必须是连续的月份序列,否则递归或累计计算会出错。
  • Net Incoming需定义为度量值,确保能实时响应What-if参数的调整。
  • 递归度量值在月份数量较多(比如超过24个月)时可能出现性能下降,优先选择非递归方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:36:02