Почему выполнение этой операции Power Query занимает так много времени?

Мне помог @teylyn в предыдущем потоке, чтобы этот код заработал.

Я столкнулся с еще некоторыми проблемами, связанными со временем выполнения запроса.

Задача:

Задача состоит в том, чтобы объединить два отдельных списка контактов в один совершенно новый список.

Мне также нужно удалить дубликаты, которые имеют одно и то же имя и название компании.

Наконец, мне нужно удалить контакты с одним и тем же идентификатором компании, но с другим названием компании. Контакты из Первичного списка следует сохранить на случай возникновения конфликта.

Приведенный ниже код работает, но его выполнение занимает слишком много времени.

Список содержит в общей сложности около 8500 контактов.

Итерация каждого контакта занимает 2,5 секунды, что в сумме составляет примерно 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"

person MrDark    schedule 18.06.2017    source источник


Ответы (1)


Вероятно, есть проблема с первой строкой, где [Индекс] = 0, поэтому [Индекс] - 1 = -1, что выходит за пределы допустимого диапазона.

В общем случае не очень эффективно ссылаться на строки таблицы с помощью индекса строки. Вместо этого лучше добавить 2 индексных столбца: 1, начинающийся с 0, другой, начинающийся с 1. Затем вы объединяете таблицу с самой собой, используя индекс на основе 0 в качестве ключа для первой таблицы и индекс на основе 1 в качестве ключа. для второго стола. В результате вы получите столбец с вложенными таблицами, содержащими данные из предыдущей строки. Если вы назовете этот столбец «Предыдущий» и развернете нужный столбец, используя исходное имя в качестве префикса, у вас будут поля из текущей строки, объединенные с полями из предыдущей строки (с префиксом «Предыдущий») рядом друг с другом и продолжить оттуда.

person MarcelBeug    schedule 18.06.2017