递归构建表

时间:2018-06-08 19:07:55

标签: powerquery

我有数据源作为帐户的“地图”。它由唯一的行ID组成,这些行ID具有直接分配给它们的帐户,或者引用地图中的其他行来汇总数据。我已将其转换为不透明的数据源。

enter image description here

为了“构建”这个“地图”,我将数据与基本地图合并,将每个ID的目标与基本ID相结合。我将得到一个结果,其中已映射到帐户的ID不返回任何内容,映射到其他ID的ID将返回在这些ID上引用的帐户或在其上引用的子ID。这个过程被设置为一个容易重复的功能。

//IterateMISMap Function
let
    Source = (MISTable as table) => let
        Source = MISTable,
        #"Merged Queries" = Table.NestedJoin(Source,{"Value"},MISMap,{"Line"},"Source",JoinKind.LeftOuter),
        #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Line Type", "Value"}),
        #"Expanded Source" = Table.ExpandTableColumn(#"Removed Columns", "Source", {"Line Type", "Value"}, {"Line Type", "Value"}),
        #"Filtered Rows" = Table.SelectRows(#"Expanded Source", each ([Line Type] <> null))
    in
        #"Filtered Rows"
in
    Source

如果我这样做6-7次,并结合每个表的结果,我得到一个最终结果,我得到一个完整的地图,其中每个ID包含流向它的每个帐户,这给了我一个简单的连接+组步骤获取每个ID的值。

这是有效的,但是现在我必须通过在连续迭代上手动运行函数来构建此映射,直到迭代返回空表。然后我将每个迭代组合成一个表并将其过滤到我想要的结果。这很难看,也依赖于我手动确定需要完成多少次迭代。

let
    Source = #table({"MappingData"}, {{MISMap}}),
    #"Added Custom" = Table.AddColumn(Source, "Custom", each IterateMISMap([MappingData])),
    #"Invoked Custom Function" = Table.AddColumn(#"Added Custom", "Custom.1", each IterateMISMap([Custom])),
    #"Invoked Custom Function1" = Table.AddColumn(#"Invoked Custom Function", "Custom.2", each IterateMISMap([Custom.1])),
    #"Invoked Custom Function2" = Table.AddColumn(#"Invoked Custom Function1", "Custom.3", each IterateMISMap([Custom.2])),
    #"Invoked Custom Function3" = Table.AddColumn(#"Invoked Custom Function2", "Custom.4", each IterateMISMap([Custom.3])),
    #"Invoked Custom Function4" = Table.AddColumn(#"Invoked Custom Function3", "Custom.5", each IterateMISMap([Custom.4])),
    #"Invoked Custom Function5" = Table.AddColumn(#"Invoked Custom Function4", "Custom.6", each IterateMISMap([Custom.5])),
    #"Invoked Custom Function6" = Table.AddColumn(#"Invoked Custom Function5", "Custom.7", each IterateMISMap([Custom.6])),
    #"Added Custom1" = Table.AddColumn(#"Invoked Custom Function6", "CombineTables", each Table.Combine({[MappingData],[Custom],[Custom.1],[Custom.2],[Custom.3],[Custom.4],[Custom.5],[Custom.6],[Custom.7]})),
    CombineTables = #"Added Custom1"{0}[CombineTables],
    #"Filtered Rows" = Table.SelectRows(CombineTables, each ([Line Type] = "ACC")),
    #"Changed Type" = Table.TransformColumnTypes(#"Filtered Rows",{{"Line", Int64.Type}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Line", Order.Ascending}})
in
    #"Sorted Rows"

我的问题是我想自动执行执行迭代的过程,并在迭代返回空表时停止。我认为这可能与List.Accumulate有关,但我不完全确定如何使用基于迭代本身的条件。我尝试了这个,似乎它给了我一次迭代的组合结果,但根本没有循环(这有意义看着它,但我不确定如何在基础数据时设置一个正确的循环一张表)

List.Accumulate({MISMap}, MISMap, 
(state,current)=>
if Table.IsEmpty(current) = false
then Table.Combine({state, IterateMISMap(current)})
else state
)

0 个答案:

没有答案