Power BI 计算特定时间段内排除重叠部分的设备总停机时长
Power BI 去重叠设备停机时长度量值解决方案
以下是可直接使用的DAX度量值代码,默认适配你提供的表结构,表名假设为故障记录表,如果实际表名/字段名不同可自行替换:
去重叠总停机时长 = VAR 统计开始时间 = MIN('日期表'[日期时间]) // 切片器绑定的时间字段下限,固定时间可直接赋值 VAR 统计结束时间 = MAX('日期表'[日期时间]) // 切片器绑定的时间字段上限,固定时间可直接赋值 // 第一步:过滤出和统计区间有交集的故障记录 VAR 过滤后故障 = FILTER( ALLSELECTED('故障记录表'), '故障记录表'[machine_id] IN VALUES('故障记录表'[machine_id]) && '故障记录表'[start_timestamp] < 统计结束时间 && ('故障记录表'[start_timestamp] + '故障记录表'[downtime (sec.)]/86400) > 统计开始时间 ) // 第二步:计算每个故障的结束时间,并裁剪到统计区间范围内 VAR 带结束时间的故障 = ADDCOLUMNS( 过滤后故障, "end_time", [start_timestamp] + [downtime (sec.)]/86400, "adj_start", MAX([start_timestamp], 统计开始时间), "adj_end", MIN([start_timestamp] + [downtime (sec.)]/86400, 统计结束时间) ) // 第三步:按故障开始时间排序 VAR 排序故障 = ADDCOLUMNS( 带结束时间的故障, "rank", RANKX(带结束时间的故障, [adj_start],, ASC, Dense) ) // 第四步:合并重叠的时间区间 VAR 合并区间 = GENERATE( VALUES('故障记录表'[machine_id]), VAR 设备故障 = FILTER(排序故障, [machine_id] = EARLIER('故障记录表'[machine_id])) VAR 最大排名 = MAXX(设备故障, [rank]) RETURN ADDCOLUMNS( GENERATESERIES(1, 最大排名), "合并后开始", VAR 当前排名 = [Value] VAR 前面的最大结束 = MAXX(FILTER(设备故障, [rank] < 当前排名), [adj_end]) RETURN MAXX(FILTER(设备故障, [rank] = 当前排名), MAX([adj_start], 前面的最大结束)), "合并后结束", VAR 当前排名 = [Value] RETURN MAXX(FILTER(设备故障, [rank] = 当前排名), [adj_end]) ) ) // 第五步:计算所有有效区间的总秒数 VAR 有效区间 = FILTER(合并区间, [合并后开始] < [合并后结束]) RETURN SUMX(有效区间, DATEDIFF([合并后开始], [合并后结束], SECOND))
使用说明
- 如你通过切片器选择统计时间段,只需将你的时间维度表的日期时间字段绑定到切片器即可,度量值会自动读取选中的时间范围
- 如你需要固定统计时间段,直接替换
统计开始时间和统计结束时间变量的取值即可,比如你给出的示例场景可直接修改为:VAR 统计开始时间 = DATETIME(2021,10,10,7,0,0) VAR 统计结束时间 = DATETIME(2021,10,10,7,10,0)
结果验证
你给出的machine_id=1的测试场景,度量值计算逻辑如下:
- 三条故障裁剪到统计区间后得到的区间分别为:7:037:04:40、7:047:04:30、7:06~7:10
- 合并重叠区间后得到两个有效区间:7:037:04:40、7:067:10
- 总时长为100秒+240秒=340秒,和预期结果一致
注意事项
- 度量值支持按设备维度拆分统计,也可直接统计全部设备的总去重叠停机时长
- 如数据量较大,可提前在Power Query中预计算每个故障的结束时间,进一步提升度量值计算效率
内容的提问来源于stack exchange,提问作者Kunis
相关产品推荐
相关产品推荐

