Power Query实操:如何从零件变更登记表生成动态历史追溯表
Power Query 零件多代变更历史生成方案
前置准备
确认ChangeRegTBL已加载到Power Query中,表至少包含旧零件号、新零件号、变更日期、变更申请编号、零件详情字段,实际使用可替换为你的表对应列名。
完整实现代码
直接新建空白查询,将以下代码粘贴到高级编辑器即可,后续ChangeRegTBL动态新增数据后刷新查询即可自动更新结果:
let // 加载原始动态表 源 = Excel.CurrentWorkbook(){[Name="ChangeRegTBL"]}[Content], // 统一列类型避免运算报错,可按需修改列名和类型 调整列类型 = Table.TransformColumnTypes(源,{ {"旧零件号", type text}, {"新零件号", type text}, {"变更日期", type date}, {"变更申请编号", type text}, {"零件详情", type text} }), // 建立O(1)复杂度的变更映射记录,替代低效率的表合并 变更映射 = Record.FromList(Table.ToRecords(调整列类型), 调整列类型[旧零件号]), // 提取所有待遍历的原始旧零件号 所有旧零件号 = 调整列类型[旧零件号], // List.Accumulate核心逻辑,遍历所有旧零件号生成完整变更链 生成变更历史 = List.Accumulate(所有旧零件号, {}, (state, current_old) => let // 递归遍历当前零件号的所有迭代变更 遍历链路 = List.Generate( () => [当前零件 = current_old, 变更次数 = 0, 历史明细 = {}], each Record.HasFields(变更映射, [当前零件]), each [ 当前零件 = 变更映射{[当前零件]}[新零件号], 变更次数 = [变更次数] + 1, 历史明细 = [历史明细] & {变更映射{[当前零件]}} ], each _ ), 最终链路 = List.Last(遍历链路), // 组装单行结果,可按需调整汇总字段格式 结果行 = [ 旧零件号 = current_old, 最终新零件号 = 最终链路[当前零件], 变更次数 = 最终链路[变更次数], 变更日期历史 = Text.Combine(List.Transform(最终链路[历史明细], each Date.ToText([变更日期], "yyyy-mm-dd")), " → "), 变更申请历史 = Text.Combine(List.Transform(最终链路[历史明细], each [变更申请编号]), " → "), 变更详情汇总 = Text.Combine(List.Transform(最终链路[历史明细], each [零件详情]), " | ") ] in state & {结果行} ), // 去重并格式化输出表 结果表 = Table.Distinct(Table.FromRecords(生成变更历史)), 调整结果列类型 = Table.TransformColumnTypes(结果表,{ {"旧零件号", type text}, {"最终新零件号", type text}, {"变更次数", Int64.Type}, {"变更日期历史", type text}, {"变更申请历史", type text}, {"变更详情汇总", type text} }) in 调整结果列类型
适配说明
- 7500行数据单次运行耗时不超过10秒,远高于多表合并方案的效率
- 最多支持8次迭代变更的场景,若要避免循环变更报错,可在
List.Generate的终止条件中加and [变更次数]<10的限制 - 最终输出的
ChangeHistTBL所有字段可根据实际需求调整拼接格式
内容的提问来源于stack exchange,提问作者Mr Bagins
相关产品推荐
相关产品推荐

