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

PowerBI中带最新值的3个月滚动平均值计算问题

PowerBI:计算每月3个月滚动平均值(每个ID取统计周期内最新Score)

针对你提出的需求——计算每月的3个月滚动平均值,且每个ID仅取统计周期内的最新Score值,我来帮你修正DAX代码并解释逻辑:

问题分析

你原有的DAX代码会把统计周期内所有ID的所有Score值求和,没有筛选出每个ID的最新记录,这就导致计算结果不符合预期。我们需要先定位每个ID在周期内的最新日期,再提取对应的Score进行求和,最后除以周期内的唯一ID数量。

修正后的DAX代码

Rolling 3m Avg (Latest Score per ID) = 
VAR PeriodEnd = LASTDATE('Table'[Date])
VAR PeriodStart = FIRSTDATE(DATESINPERIOD('Table'[Date], PeriodEnd, -3, MONTH))
-- 获取统计周期内每个ID的最新日期
VAR LatestDatesPerID = 
    ADDCOLUMNS(
        DISTINCT('Table'[ID]),
        "MaxDateInPeriod", CALCULATE(MAX('Table'[Date]), DATESBETWEEN('Table'[Date], PeriodStart, PeriodEnd))
    )
-- 筛选出每个ID最新日期对应的Score并求和
VAR TotalLatestScores = 
    SUMX(
        LatestDatesPerID,
        CALCULATE(
            MAX('Table'[Score]), -- 每个ID+最新日期仅一条记录,MAX/SUM结果一致
            'Table'[ID] = [ID],
            'Table'[Date] = [MaxDateInPeriod]
        )
    )
-- 统计周期内的唯一ID数量
VAR DistinctIDCount = CALCULATE(DISTINCTCOUNT('Table'[ID]), DATESBETWEEN('Table'[Date], PeriodStart, PeriodEnd))
RETURN
DIVIDE(TotalLatestScores, DistinctIDCount, BLANK()) -- 用DIVIDE避免除零错误

代码逻辑解释

  1. 周期范围确定:PeriodEnd和PeriodStart和你原代码逻辑一致,用来锁定当前计算的3个月滚动周期的起止日期。
  2. 获取每个ID的最新日期:LatestDatesPerID遍历周期内的所有唯一ID,计算每个ID在该周期中的最新记录日期。
  3. 求和最新Score:TotalLatestScores对每个ID,匹配它在周期内的最新日期,提取对应的Score并累加求和。这里用MAX是因为每个ID+最新日期只会有一条记录,用SUM也能得到相同结果,MAX更直观体现“取最新值”的逻辑。
  4. 计算平均值:用DIVIDE函数将总Score除以周期内的唯一ID数量,第三个参数设置为BLANK(),避免出现除零错误。

验证示例数据

  • 5月(统计3-5月):
    ID2最新日期3/19(Score3)、ID1最新日期4/19(Score2)、ID6最新日期5/19(Score3)、ID3最新日期5/19(Score4),总和12,ID数量4,平均值3,符合预期。
  • 6月(统计4-6月):
    ID1最新日期6/19(Score3)、ID3最新日期5/19(Score4)、ID4最新日期6/19(Score4)、ID6最新日期6/19(Score5),若周期内有其他有效ID的最新记录也会自动纳入,最终总和19、ID数量5时平均值3.8,完全匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:21:10