Ниже приведено ОБНОВЛЕННОЕ решение.
В общем, я скомпилировал решение, чтобы быть как можно менее уязвимым к проблемам с данными.
Единственными ограничениями для данных являются:
Наборы полей должны иметь поле ID, которое должно быть первым полем набора.
все RRUL и ADDR должны быть в парах,
Дубликаты пар RRUL / ADDR внутри одного идентификатора допустимы или отсутствуют.
Я также скомпилировал решение, чтобы правильно найти наиболее близкое значение во всех возможных вариантах ADDR и PREFIX. Кстати, есть один случай, который не описан в вашем большом примере - когда PREFIX короче, чем ADDR, но не равен ему. Если есть такие случаи - мое решение обрабатывает их правильно, но требует определенных издержек производительности для этой конкретной ситуации.
let
Source = #"Source data",
#"Added Index1" = Table.AddIndexColumn(Source, "Index", 0, 1),
#"Added Custom" = Table.AddColumn(#"Added Index1", "Main Key", each if [DESCRIPTION] = "ID" then [Index] else null, type number),
#"Added Custom10" = Table.AddColumn(#"Added Custom", "Last notADDR", each
if [DESCRIPTION] <> "ADDR" and [DESCRIPTION] <> "RRUL" then [Index] else null),
#"Filled Down" = Table.FillDown(#"Added Custom10",{"Main Key", "Last notADDR"}),
#"Added Custom2" = Table.AddColumn(#"Filled Down", "Key", each [Main Key] + (
if [DESCRIPTION] = "RRUL" then [Index] - [Last notADDR] - 2
else if [DESCRIPTION] = "ADDR" then [Index] - [Last notADDR] - 1 else 0)),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom2",{"Index", "Main Key", "Last notADDR"}),
#"Pivoted Column1" = Table.Pivot(#"Removed Columns",
List.Distinct(#"Removed Columns"[DESCRIPTION]), "DESCRIPTION", "VALUE"),
#"Added Custom3" = Table.AddColumn(#"Pivoted Column1", "CODE", each if [ADDR] = null then null else let t = Table.AddIndexColumn(Table.SelectRows(Criterias, (x)=>
let s=List.Sort({x[PREFIX], [ADDR]}, each Text.Length(_)) in Text.StartsWith(s{1}, s{0})), "Index")
in if Table.RowCount(t) > 0 then Table.First(Table.Sort(t, (y)=> Number.BitwiseShiftLeft(Number.Abs(Text.Length([ADDR]) - Text.Length(y[PREFIX])), 16) + y[Index]))[CODE]
else "Not Found"),
#"Removed Columns1" = Table.RemoveColumns(#"Added Custom3",{"Key", "ADDR"}),
#"Filled Down1" = Table.FillDown(#"Removed Columns1",{"ID", "NAME", "TYPE", "DFRUL"})
in
#"Filled Down1"