为什么这个Power Query操作需要很长时间才能完成?

时间:2017-06-18 12:17:47

标签: excel optimization powerquery m

我从@teylyn in a previous thread得到了一些帮助,以使这段代码能够正常运行。

我在查询的操作时间方面遇到了一些麻烦。

任务:

任务是将两个单独的联系人列表合并为一个全新的列表。

我还需要删除共享相同名称和公司名称的重复项。

最后,我需要删除共享相同CompanyID但公司名称不同的联系人。应保留主列表中的联系以防发生冲突。

以下代码有效,但需要很长时间才能完成。

该列表共包含约8500个联系人。

迭代每个触点需要2.5秒,这会使upp增加约6小时直到完成。

我的问题:

为什么这个操作需要这么长时间,有没有办法让它更快?

let
    Source = Table.Combine({PrimaryContacts, SecondaryContacts}), 
    #"Removed duplicates" = Table.Distinct(Source, {"CompanyID", "FirstName", "LastName"}),
    #"Sorted rows" = Table.Sort(#"Removed duplicates",{{"CompanyID", Order.Ascending}, {"Email", Order.Descending}}),
    #"Filtered rows" = Table.SelectRows(#"Sorted rows", each ["FirstName"] <> null and ["FirstName"] <> ""),
    #"Added index" = Table.AddIndexColumn(#"Filtered rows", "Index", 10000, 1),
    #"Renamed columns" = Table.RenameColumns(#"Added index",{{"Index", "ContactID"}}),
    #"Reordered columns" = Table.ReorderColumns(#"Renamed columns",{"ContactID", "CompanyID", "CompanyName", "FirstName", "LastName}), // I have removed 10 columns for privacy reasons
    #"Added index1" = Table.AddIndexColumn(#"Reordered columns", "Index", 0, 1),
    #"Filtered rows1" = Table.SelectRows(#"Added index1", each (["ContactID"] = 10000 or ["ContactID"] = 10001 or ["ContactID"] = 10002 or ["ContactID"] = 10003 or ["ContactID"] = 10004 or ["ContactID"] = 10005)), 
    /* The filter above is temporary to be able to check if next step works */
    /* It is the step below that takes too much time to finish */
    #"Add custom" = Table.AddColumn(#"Filtered rows1", "Delete", each if ["CompanyID"]= #"Reordered columns"{[Index]-1}["CompanyID"] and ["CompanyName"]<> #"Reordered columns"{[Index]-1}["CompanyName"] then "Delete" else null)
in
    #"Add custom"

1 个答案:

答案 0 :(得分:1)

第一行可能存在问题,其中[Index] = 0所以[Index] - 1 = -1超出范围。

通常,使用行索引引用表行效率不高。 相反,最好添加2个索引列:1从0开始,另一个从1开始。接下来,将表与自身合并,使用基于0的索引作为第一个表的键,将基于1的索引作为键对于第二个表。因此,您将获得包含嵌套表的列,其中包含上一行中的数据。如果将此列命名为“上一个”并展开所需列,则使用原始名称作为前缀,您将当前行中的字段与前一行中的字段(前缀为“上一个”。)相邻,并继续从那里。