Power Query处理系统可靠性报告:修复未配对故障起止数据
系统可靠性报告数据处理:修复无效故障起止并生成可用性状态
我正在为多个系统构建可靠性报告,使用Power Query处理数据。源数据仅记录每日故障的Start(开始)或End(结束),未体现系统在其他日期的运行状态(Up/Down),因此需要生成可用性数据。
我已尝试对齐故障起止日期,将区间内日期标记为不可用,其余日期标记为可用,但发现部分系统存在未结束前就启动新故障的情况(如示例中的Heater)。这类中间位置的未配对故障起止不符合逻辑,需移除无效的起始记录,仅允许数据首尾出现未配对的故障起止。
示例输入
| 系统名称 | 日期 | 故障状态 |
|---|---|---|
| Generator | 22/01/2020 | |
| Generator | 23/01/2020 | End |
| Generator | 24/01/2020 | |
| Generator | 25/01/2020 | Start |
| Generator | 26/01/2020 | |
| Generator | 27/01/2020 | End |
| Generator | 28/01/2020 | |
| Pump | 22/01/2020 | |
| Pump | 23/01/2020 | Start |
| Pump | 24/01/2020 | |
| Pump | 25/01/2020 | End |
| Pump | 26/01/2020 | |
| Pump | 27/01/2020 | Start |
| Pump | 28/01/2020 | |
| Cooler | 22/01/2020 | |
| Cooler | 23/01/2020 | End |
| Cooler | 24/01/2020 | |
| Cooler | 25/01/2020 | |
| Cooler | 26/01/2020 | |
| Cooler | 27/01/2020 | Start |
| Cooler | 28/01/2020 | |
| Heater | 22/01/2020 | |
| Heater | 23/01/2020 | Start |
| Heater | 24/01/2020 | End |
| Heater | 25/01/2020 | Start |
| Heater | 26/01/2020 | |
| Heater | 27/01/2020 | Start |
| Heater | 28/01/2020 | End |
示例输出
| 系统名称 | 日期 | 运行状态 |
|---|---|---|
| Generator | 22/01/2020 | Down |
| Generator | 23/01/2020 | Down |
| Generator | 24/01/2020 | Up |
| Generator | 25/01/2020 | Down |
| Generator | 26/01/2020 | Down |
| Generator | 27/01/2020 | Down |
| Generator | 28/01/2020 | Up |
| Pump | 22/01/2020 | Up |
| Pump | 23/01/2020 | Down |
| Pump | 24/01/2020 | Down |
| Pump | 25/01/2020 | Down |
| Pump | 26/01/2020 | Up |
| Pump | 27/01/2020 | Down |
| Pump | 28/01/2020 | Down |
| Cooler | 22/01/2020 | Down |
| Cooler | 23/01/2020 | Down |
| Cooler | 24/01/2020 | Up |
| Cooler | 25/01/2020 | Up |
| Cooler | 26/01/2020 | Up |
| Cooler | 27/01/2020 | Down |
| Cooler | 28/01/2020 | Down |
| Heater | 22/01/2020 | Up |
| Heater | 23/01/2020 | Down |
| Heater | 24/01/2020 | Down |
| Heater | 25/01/2020 | Up |
| Heater | 26/01/2020 | Up |
| Heater | 27/01/2020 | Down |
| Heater | 28/01/2020 | Down |
优化后的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
相关产品推荐
相关产品推荐

