Power BI按小时计算平均误差及总计行修正技术问题
解决Power BI小时级平均误差及总计行计算问题
问题分析
原有度量值存在两个核心问题:
- 迭代粒度不匹配:
VALUES('Fact Table_TIME'[Hour])仅迭代小时维度,但可视化是按日+小时分组,聚合逻辑未适配当前上下文; - 总计行逻辑错误:未区分常规行(日/小时分组)和总计行的计算逻辑,导致总计返回的是所有小时的误差率平均,而非列中显示值的平均。
修正后的度量值代码
Measure_1 = // 1. 计算当前日+小时上下文下的小时级误差率 VAR HourlyError = CALCULATE( VAR AvgActual = AVERAGE(Data_table_A[实际值列名]) // 替换为Data_table_A中分钟级实际值的列名 VAR AvgForecast = AVERAGE(Data_table_B[预测值列名]) // 替换为Data_table_B中分钟级预测值的列名 RETURN IF( OR(AvgActual <= 0, AvgForecast <= 0), BLANK(), DIVIDE(ABS(AvgActual - AvgForecast), AvgActual) ), ALLEXCEPT('Fact Table_Date', 'Fact Table_Date'[Date]), ALLEXCEPT('Fact Table_TIME', 'Fact Table_TIME'[Hour]) ) // 2. 获取全局所有有效小时的误差值,用于总计行计算 VAR AllValidHourlyErrors = CALCULATETABLE( SELECTCOLUMNS( CROSSJOIN(VALUES('Fact Table_Date'[Date]), VALUES('Fact Table_TIME'[Hour])), "@Error", HourlyError ), REMOVEFILTERS() ) // 3. 判断是否为总计行,返回对应结果 VAR IsTotalRow = ISINSCOPE('Fact Table_Date'[Date]) = FALSE && ISINSCOPE('Fact Table_TIME'[Hour]) = FALSE RETURN IF( IsTotalRow, AVERAGEX(FILTER(AllValidHourlyErrors, NOT(ISBLANK([@Error]))), [@Error]), HourlyError )
代码说明
- 小时级误差计算:通过
CALCULATE结合ALLEXCEPT锁定当前日和小时上下文,先计算该小时内分钟级数据的实际值、预测值平均值,再计算误差率; - 总计行处理:用
ISINSCOPE判断是否处于总计上下文,若是则计算所有有效(非空)小时误差值的平均,完全匹配“总计显示列的平均值”的要求; - 无效数据过滤:当实际值或预测值≤0时返回空值,排除无效数据对计算的干扰。
使用注意事项
- 替换代码中的
Data_table_A[实际值列名]和Data_table_B[预测值列名]为数据表中对应的分钟级数值列; - 确保
Fact_table_Date、Fact_table_Time与两个数据表的关联关系正确(日期表关联日期字段,时间表关联小时字段)。
内容的提问来源于stack exchange,提问作者Sultry T.
相关产品推荐
相关产品推荐

