希望一个强大的查询忍者可以帮助解决这个…
引用附件,我有两个表,第一个ChangeRegTBL是一个动态表(目前有一些7500+线长),它将我们实现的更改附加到构建/装配线中。在某些情况下,这些部件号的更改将再次更改为新编号(…)。在某些情况下,是7-8次!
我想要的是一个表(在参考附件中显示为ChangeHistTBL ),它列出了“旧”的每个部分的历史以及它取代的“新”部分是什么,如果更改不止一次,则为计数,最后是汇总日期、更改请求和部分细节的历史表。
现在我经历了多次合并,等等,…但它只是混乱,缓慢,当然不处理一个动态的桌子。
试着处理好名单。累加函数…我觉得解决办法就在这个范围内
干杯

好的,我似乎不能添加一个工作簿作为附件,但可以发送这个如果需要!

发布于 2021-09-22 10:22:01
尝试使用List.Generate为每个部件编号生成一个部件历史记录,如您的表中所示,使用List.PositionOf为下一个历史步骤在Old Part列中找到New Part。
该算法在“旧部件”列中对“新部件”进行一系列查找,然后将相应的历史条目添加到与“旧部件”关联的“部件历史记录”列表中。
不确定这种方法是否会更快,但应该是动态的:
请参阅代码中的注释。问是否有不清楚的事情
M码
编辑后的将部件新列更改为列表中的持久列
编辑以在当前行启动List.Generate循环
编辑以消除原始零件编号重复使用时的循环循环()
let
Source = Csv.Document(File.Contents("C:\Users\ron\OneDrive\Documents\ChangeReg.csv"),[Delimiter=",", Columns=5, Encoding=1252, QuoteStyle=QuoteStyle.None]),
#"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Index", Int64.Type}, {"Change Ref", type text}, {"Part Old", type text}, {"Part New", type text}, {"Part Description", type text}}),
//Create Part History column
ph = Table.AddColumn(#"Changed Type", "hist", each
let
cr = Text.Split([Change Ref]," ")
in cr{1} & "_" & [Part New] & "_" & cr{0} & "_" & [Part Description]),
#"Removed Columns" = Table.RemoveColumns(ph,{"Change Ref", "Part Description"}),
//create list of part histories and successor part number
#"Added Custom" = Table.AddColumn(#"Removed Columns", "phList", each
let
//start search at current row
newPart = List.RemoveFirstN(ph[Part New],[Index]),
oldPart = List.RemoveFirstN(ph[Part Old],[Index]),
partHist = List.RemoveFirstN(ph[hist],[Index]),
index = List.RemoveFirstN(ph[Index],[Index]),
trace = List.Generate(()=> [newP=newPart{0}, hist=partHist{0}, idx= index{0}],
each [idx] <> null,
each
let
//note that if [newP] not found then List.PositionOf => -1
i = List.PositionOf(oldPart,[newP])
in if i > index{0} then
[newP = newPart{List.PositionOf(oldPart,[newP])},
hist = partHist{List.PositionOf(oldPart,[newP])},
idx = index{List.PositionOf(oldPart,[newP])}]
else
[idx=null])
in
trace),
#"Removed Columns1" = Table.RemoveColumns(#"Added Custom",{"Part New", "hist"}),
//Add last part number in the sequence
#"Added Custom1" = Table.AddColumn(#"Removed Columns1", "Part New", each List.Last([phList])[newP]),
//count number of times the part number changed
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "Superceded Count", each List.Count([phList])),
//concatenate history of all the changes in the part numbers
#"Added Custom3" = Table.AddColumn(#"Added Custom2", "Part History", each List.Accumulate([phList],"",
(state,current)=> if state = "" then current[hist] else state & "#(lf)" & current[hist])),
#"Removed Columns2" = Table.RemoveColumns(#"Added Custom3",{"phList"})
in
#"Removed Columns2"源

结果

https://stackoverflow.com/questions/69273423
复制相似问题