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避免除零错误
代码逻辑解释
- 周期范围确定:
PeriodEnd和PeriodStart和你原代码逻辑一致,用来锁定当前计算的3个月滚动周期的起止日期。 - 获取每个ID的最新日期:
LatestDatesPerID遍历周期内的所有唯一ID,计算每个ID在该周期中的最新记录日期。 - 求和最新Score:
TotalLatestScores对每个ID,匹配它在周期内的最新日期,提取对应的Score并累加求和。这里用MAX是因为每个ID+最新日期只会有一条记录,用SUM也能得到相同结果,MAX更直观体现“取最新值”的逻辑。 - 计算平均值:用
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
相关产品推荐
相关产品推荐

