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

Power Query处理系统可靠性报告:修复未配对故障起止数据

系统可靠性报告数据处理:修复无效故障起止并生成可用性状态

我正在为多个系统构建可靠性报告,使用Power Query处理数据。源数据仅记录每日故障的Start(开始)或End(结束),未体现系统在其他日期的运行状态(Up/Down),因此需要生成可用性数据。

我已尝试对齐故障起止日期,将区间内日期标记为不可用,其余日期标记为可用,但发现部分系统存在未结束前就启动新故障的情况(如示例中的Heater)。这类中间位置的未配对故障起止不符合逻辑,需移除无效的起始记录,仅允许数据首尾出现未配对的故障起止。

示例输入

系统名称日期故障状态
Generator22/01/2020
Generator23/01/2020End
Generator24/01/2020
Generator25/01/2020Start
Generator26/01/2020
Generator27/01/2020End
Generator28/01/2020
Pump22/01/2020
Pump23/01/2020Start
Pump24/01/2020
Pump25/01/2020End
Pump26/01/2020
Pump27/01/2020Start
Pump28/01/2020
Cooler22/01/2020
Cooler23/01/2020End
Cooler24/01/2020
Cooler25/01/2020
Cooler26/01/2020
Cooler27/01/2020Start
Cooler28/01/2020
Heater22/01/2020
Heater23/01/2020Start
Heater24/01/2020End
Heater25/01/2020Start
Heater26/01/2020
Heater27/01/2020Start
Heater28/01/2020End

示例输出

系统名称日期运行状态
Generator22/01/2020Down
Generator23/01/2020Down
Generator24/01/2020Up
Generator25/01/2020Down
Generator26/01/2020Down
Generator27/01/2020Down
Generator28/01/2020Up
Pump22/01/2020Up
Pump23/01/2020Down
Pump24/01/2020Down
Pump25/01/2020Down
Pump26/01/2020Up
Pump27/01/2020Down
Pump28/01/2020Down
Cooler22/01/2020Down
Cooler23/01/2020Down
Cooler24/01/2020Up
Cooler25/01/2020Up
Cooler26/01/2020Up
Cooler27/01/2020Down
Cooler28/01/2020Down
Heater22/01/2020Up
Heater23/01/2020Down
Heater24/01/2020Down
Heater25/01/2020Up
Heater26/01/2020Up
Heater27/01/2020Down
Heater28/01/2020Down

优化后的Power Query M代码

let
    数据源 = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("hdIxC8MgEAXg/+IciDWxyV5KOxYyhgxC3dpYxP7/dpEXvBczyud59zjnWd386qNLIapGGdPqU2u00f+DWppCu41e16e80FfL7Uan5GKSV87VB4aj/mNZ/vi+PzRXho7OlFXkyWDJJNlEhgxDtZeY/RLCy/OtgNhKoGJ+kN0nEQDEI8BFiLt3aScEiC8B3pOQUP6t4CIOiMeBj2Xj5Qc=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [系统名称 = _t, 日期 = _t, 故障状态 = _t]),
    系统数据 = Table.TransformColumnTypes(数据源,{{"系统名称", type text}, {"日期", type date}, {"故障状态", type text}}),
    添加日期列 = Table.Group(系统数据, {"系统名称"}, {{"日期表", each _, type nullable table[系统名称 = nullable text, 日期 = nullable date, 故障状态 = nullable text]}}),
    合并数据 = Table.NestedJoin(添加日期列, {"系统名称"}, 系统数据, {"系统名称"}, "合并表", JoinKind.Inner),
    展开合并表 = Table.ExpandTableColumn(合并数据, "合并表", {"日期", "故障状态"}, {"日期", "故障状态"}),
    添加上一条故障记录 = Table.AddColumn(展开合并表, "上一条故障记录", each Table.Max(Table.SelectRows([日期表], (inner)=>inner[日期]<[日期]), "日期")),
    添加下一条故障记录 = Table.AddColumn(添加上一条故障记录, "下一条故障记录", each Table.Min(Table.SelectRows([日期表], (inner)=>inner[日期]>[日期]), "日期")),
    添加运行状态 = Table.AddColumn(添加下一条故障记录, "运行状态", each
    if [故障状态]=null and [上一条故障记录]<>null and [上一条故障记录][故障状态]="End" then "Up" else
    if [故障状态]=null and [下一条故障记录]<>null and [下一条故障记录][故障状态]="Start" then "Up" else
    if [故障状态]="Start" and [下一条故障记录]<>null and [下一条故障记录][故障状态]="Start" then "Up" else
    if [故障状态]="End" and [下一条故障记录]<>null and [下一条故障记录][故障状态]="End" then "Down" else
    "Down", type text),
    移除冗余列 = Table.SelectColumns(添加运行状态, {"系统名称", "日期", "故障状态", "运行状态"})
in
    移除冗余列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:07:34