2017-06-18 3 views
0

Ich habe Hilfe von @teylyn in a previous thread bekommen, um diesen Code zu bekommen.Warum dauert diese Power Query-Operation so lange?

Ich habe mehr Probleme in Bezug auf die Betriebszeit für die Abfrage aufgetreten.

Die Aufgabe:

Die Aufgabe ist zwei Listen separaten Kontakt in eine völlig neue Liste zu kombinieren.

Ich muss auch Duplikate entfernen, die den gleichen Namen und den gleichen Firmennamen haben.

Schließlich muss ich Kontakte entfernen, die die gleiche CompanyID teilen, aber der Firmenname unterscheidet sich. Die Kontakte aus der Liste Primär sollten im Falle eines Konflikts beibehalten werden.

Der untenstehende Code funktioniert, benötigt aber viel zu lange Zeit.

Die Liste enthält insgesamt ca. 8500 Kontakte.

Es dauert 2,5 Sekunden, um durch jeden Kontakt zu iterieren, der bis ca. 6 Stunden dauert, bis es fertig ist.

Meine Frage:

Warum dieser Vorgang so lange dauern und ist es eine Möglichkeit, es schneller zu machen?

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" 

Antwort

1

Wahrscheinlich ist es ein Problem mit der ersten Zeile, in der [Index] = 0 so [Index] - 1 = -1, die außerhalb des Bereichs liegt.

Im Allgemeinen ist es nicht sehr effizient, mit einem Zeilenindex auf Tabellenzeilen zu verweisen. Stattdessen ist es besser, 2 Indexspalten hinzuzufügen: 1 beginnt mit 0, der andere beginnt mit 1. Als nächstes verschmelzen Sie die Tabelle mit sich selbst, wobei Sie den 0-basierten Index als Schlüssel für die erste Tabelle und den 1-basierten Index verwenden Schlüssel für die zweite Tabelle. Als Ergebnis erhalten Sie eine Spalte mit geschachtelten Tabellen, die die Daten aus der vorherigen Zeile enthalten. Wenn Sie diese Spalte "Zurück" benennen und die erforderliche Spalte unter Verwendung des ursprünglichen Namens als Präfix erweitern, haben Sie Felder aus der aktuellen Zeile mit den Feldern aus der vorherigen Zeile (mit dem Präfix "Zurück") nebeneinander und fahren fort von dort.

+0

Ihre Lösung funktionierte wie ein Charme! Danke @Marcel! – MrDark

Verwandte Themen