Anzeige
Archiv - Navigation
1964to1968
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

PowerQuery Custom Column: Match Function zu anderer Tabelle.

PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 11:30:33
captainkeksxx
Hallöle,

ich versuche in PowerQuery eine Custom Column (Benutzerdefinierte Spalte) hinzuzufügen und eine Match-Funktion zu bauen, was aber bisher auf allen Linien erfolglos war.

Tabelle1 -> calculation_full
Hat eine Spalte Namens G_M0 mit Zahlenwerten zwischen 0,00001 und 999,999999.

Tabelle2 -> tbl_paramter
Hat eine Spalte (Name: Bereich) die den Namen des Bereichs beinhaltet z.B. 0-9, 10-19, 20-29 usw.
Daneben ist eine Spalte (Name: Einstrahlung) die quasi den Maximalwert des Bereiches enthält z.b. für 10-19 den Wert 10.

In Excel bietet die =VERGLEICH-Funktion die Möglichkeit, mit dem letztem Attribut dem "Vergleichstyp" entweder 0 für exakte Übereinstimmung oder 1 für größten Wert oder -1 für kleinsten Wert, zu wählen.
Wenn ich also Vergleichstyp 1 wähle und die Funktion ein G_M0 Wert von 18,456 hat, dann ist dieser im Bereich 10-19, da dieser größer gleich 10 ist und kleiner als der nächste Wert 20.

Die Vergleichs-Funktion Würde ich auch gerne in PowerQuery einbinden.
Leider klappt das nicht mit dem Kombinieren von Tabellen, da die Fuzzy-Funktion nur für Strings zählt.
Auch bei den Custom Columns gibt es keine direkte Match-Funktion. Ich habe schon Versucht den Index des gefundenen Werts in der Spalte tbl_parameter[Einstrahlung] zu bekommen und dann die Zeile aus tbl_paramter[Bereich] abzurufen, aber vergebens. Ich habe immer nur Error Werte erhalten.
z.B.
  

= if Table.RowCount(Table.SelectRows(tbl_parameter, each tbl_parameter[Einstrahlung] >= [G_M0] and tbl_parameter[Einstrahlung] + 10 [G_M0])) > 0 then Table.PositionOf(tbl_parameter, Table.SelectRows(tbl_parameter, each tbl_parameter[Einstrahlung] >= [G_M0] and tbl_parameter[Einstrahlung] + 10 [G_M0]){0}) else null


Kennt sich jmd gut mit PowerQuery aus und kennt ein einfach Lösung? Ich kann mir irgendwie nicht vorstellen, dass das nicht gehen soll oder hoch komplex ist.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 12:03:39
Yal
Hallöle Keks,

Du beschreibst zwar ausführlich, wie Du etwas machen möchtest, aber verwässerst damit, was Du erreichen willst.

Bei PQ muss man die Vorgehensweise anders denken: Du willst eine Zeile aus der Tabelle extrahieren? Dann nicht diese Zeile ermitteln und extrahieren, sondern einfach alle andere Zeilen wegfiltern.

Genaueres kann ich nur mithilfe einer Datei (Dummy Daten reichen) zusammenbasteln. Es muss darin erkennbbar sein, was kommt rein und was rauskommen müsste.

VG
Yal

AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 12:48:04
captainkeksxx
Hi Yal,

https://www.herber.de/bbs/user/167419.xlsx

anbei eine Testdatei.

Im Tab "Ziel PQ" habe ich es mal so gemacht wie es in PQ sein soll. Es soll die Spalte "Bereich" hinzugefügt werden, die gibt es im Datensatz so nicht.

In PQ habe ich diese Tabelle einmal reingeladen und die Spalte Bereich soll nun in PQ ermittelt werden. Denn ich habe unmengen Textdateien mit Daten. Ich kann diese auch nicht erst in Excel reinladen, da die Zeilen bis zu 20mio gehen.
Ich habe auch in der zwischenzeit versucht, das ganze im Datenmodell umzusetzen, aber da gibt es natürlich auch keine Excellike Match-Funktion...
Anzeige
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 13:10:23
Yal
Hallo Moritz,

was gefehlt hat, ist die Berechnung Number.RoundDown([G_M0],-1)
Mit dieser Formel machst Du aus einem 18,25 einen 10. Mit Number.RoundUp([G_M0],-1) würde 20 rauskommen.
Dann kann man die tbl_Parameter über die Strahlung joinen. Man könnte auch direkt aus dem 10 oder 20 das Ergebnis "002-10-20" erzeugen.

https://www.herber.de/bbs/user/167421.xlsx

VG
Yal
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 14:39:58
captainkeksxx
Hi Yal,

die Lösung ist an sich nicht schlecht und passt auf das aktuelle Szenario, wenn die Bereiche gleiche Abstände haben.
Aber wenn ich Bereiche verändere, z.B. 0-19, 20-99, 100-399 bspw. in der Spalte Einstrahlung: 0, 20, 100 würde es nicht mehr funktionieren.

Ich müsste auch hier vorher mit den ungerundeten Werten wissen, wie ich sie Runden müsste.

Grüße
Anzeige
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 15:47:34
captainkeksxx
Hi Yal,

ich glaube ich habs jetzt finally auch in PQ gelöst. Die Formel wäre:

= List.Max(Table.SelectRows(#"tbl_parameter", (x) => x[Einstrahlung]  [G_M0])

[Einstrahlung])


So wird der nächst kleinere Wert in tbl_parameter gesucht und dann wie von dir einfach per Kombinieren der Tabellen (Join)
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 18:29:02
Yal
Moin,

das Thema der Variablen Cluster hatte ich auch im Gedanken, war aber nicht Teil der Anforderung.

Ich habe den Anlass genommen, um meinen Rückstand in Sachen Lambda-Funktion in Power Query nachzuholen.

Ich habe zuerst nicht erklären können, warum ich mit der gegebenen Schreibweise nicht glücklich bin:
= List.Max(Table.SelectRows(#"tbl_parameter", (x) => x[Einstrahlung]  [G_M0])[Einstrahlung])


Es liegt daran, dass diese Functionsparameter "x" die ganze Tabelle tbl_parameter darstellt. Es ist irrsinnig, ein festes, nicht veränderbare Element Zeile für Zeile erneut zu übergeben. Ok, es funktioniert. Aber schön ist es nicht.

Aber da nur die Spalte Einstrahlung betrachtet wird, sollte man List.Select verwenden, anstatt Table.SelectRows. Und weil tbl_parameter sortiert ist, kann man List.Last anstatt List.Max nehmen (ob schneller?).

Um einen Lambda effizient zu verwenden, erzeugt man zuerst einen Duplikat von G_M0 und transformiere die neue Spalte

Dupli = Table.DuplicateColumn(#"Entfernte Spalten1", "G_M0", "G_M1"),

Trafo = Table.TransformColumns(Dupli, {"G_M1", (x) => List.Last(List.Select(tbl_parameter[Einstrahlung], each _ x))})


Das gesamt sieht dann so aus:
let

Quelle = Excel.CurrentWorkbook(){[Name="calculation_full"]}[Content],
#"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"timestamp", type datetime}, {"E_Z_EVU", type number}, {"G_M0", type number}, {"Verhaeltnis_kWh_pro_Wqm", type number}, {"Bereich", type text}}),
#"Entfernte Spalten" = Table.RemoveColumns(#"Geänderter Typ",{"Bereich"}),
Dupli = Table.DuplicateColumn(#"Entfernte Spalten", "G_M0", "G_M1"),
Trafo = Table.TransformColumns(Dupli, {"G_M1", (x) => List.Last(List.Select(tbl_parameter[Einstrahlung], each _ = x))}),
#"Zusammengeführte Abfragen" = Table.NestedJoin(Trafo, {"G_M1"}, tbl_parameter, {"Einstrahlung"}, "tbl_parameter", JoinKind.LeftOuter),
#"Erweiterte tbl_parameter" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "tbl_parameter", {"Bereich"}, {"Bereich"}),
#"Entfernte Spalten1" = Table.RemoveColumns(#"Erweiterte tbl_parameter",{"G_M1"})
in
#"Entfernte Spalten1"


VG
Yal
Anzeige
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 19:28:44
Luschi
Hallo Yal,

bei diesem PQA-Schritt:
Trafo = Table.TransformColumns(Dupli, {"G_M1", (x) => List.Last(List.Select(tbl_parameter[Einstrahlung], each _ = x))});
stimmt diese Aussage nicht: Es liegt daran, dass diese Functionsparameter "x" die ganze Tabelle tbl_parameter darstellt
Begründung:
- Table.TransformColumns klappert in der Tabelle 'Dupli' jeden Zeilenwert der Spalte 'G_M1' ab
  und stellt dafür den Parameter '_' bereit
- List.Select klappert in der entstehenden Liste tbl_parameter[Einstrahlung] jeden Eintrag ab
  und stellt wieder ein '_' bereit
- Standard für (x) => ist eigentlich each mit dem '_' was man auch so schreiben kann: (_)=>
- da es aber in der o.g. PQ-Zeile 2 Funktionen mit 'each' gibt, die jeweils ihr eigenes '_' bereitstellen
- löst man jedes 'each' auf in (x)=> und (y)=>

Bei mir sieht die o.g. PQ-Zeile so aus:
Trafo = Table.TransformColumns(Dupli, {"G_M1", (x) => List.Max(List.Select(tbl_parameter[Einstrahlung], (y)=> y = x))})
also List.Max statt List.Last

Gruß von Luschi
aus klein-Paris

PS: Warum List Max statt List.Last
Sollte die Tabelle 'tbl_parameter' nicht sauber gepflegt werden, eventuelle weiteren Untereinstufungen nicht am richtigen Platz einsortiert sein, ist das Dilemma da und stehen am Ender der Auflistung.
Anzeige
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 20:58:17
Yal
Hallo Luschi,

ich freue mich immer über den Austausch mit anderen PQ-Enthusiasten.

Meine Aussage "x die ganze Tabelle tbl_parameter darstellt" bezieht sich auf folgende überlieferte PQ-Zeile, die ich nicht mochte:
= List.Max(Table.SelectRows(#"tbl_parameter", (x) => x[Einstrahlung]  [G_M0])[Einstrahlung])

Wenn man die "Table.SelectRows" per Klick einrichtet (ganz normalen Filter) sieht man, dass die Tabelle nicht die gefilterte Spalte vorangestellt werden muss. Es ist hier geschuldet, dass die Verschachtelung auf einer anderen Tabelle verweist. Lustigerweise funktioniert tbl_parameter[Einstrahlung] in diesem Konstrukt nicht.

"Table.TransformColumns klappert in der Tabelle 'Dupli' jeden Zeilenwert der Spalte 'G_M1' ab und stellt dafür den Parameter '_' bereit"
Ja, aber das wesentlich ist, dass TransformColumns eine Transformationsfunktion erwartet. Wenn man z.B. die Spalte Einstrahlung multiplizieren möchte:
= Table.TransformColumns (#"Geänderter Typ", {"Einstrahlung", each _*2})
ist "each _ * 2" eine Funktion. Man diese auch (x)=>x*2 schreiben. Geht auch, aber nur weil TransformColumns je eine Spaltenbezug liefert. "je", weil mehrere Einzelspaltenbehandlung vorgenommen werden könnten: {{ .. },{ .. }} .

Warum nicht den "_" verwenden? Weil in der Funktion ebenfalls eine Transformation vorkommt, bei dem ich dachte (wobei ich inzwischen besser weiss), dass es unbedingt "each _" verlangt, und zwar für die Einzel-Einträge von tbl_parameter. Dann kann man nicht 2 "_" nebeneinander verwenden und muss über die Lambda-Schrebweise gehen.

"Standard für (x) => ist eigentlich each mit dem '_' was man auch so schreiben kann: (_)=>"
Nein, in der Form "(_)=>" kann man nicht schreiben. Aber ich sehe, was Du meinst. Der Variablename und der übergegebene Wert sind getrennt voneinander. und "_" ist ein reserviertes Wort.

"löst man jedes 'each' auf in (x)=> und (y)=>"
Ja, richtig. Hatte ich, im Stand meines aktuellen Rückstands in der Materie, noch nicht auf dem Schirm. Das ist die Lösung, um den "_" weder zweimal noch einmal zu verwenden. Siehe den "Warum ..". Muss ich mich merken.

"List.Last oder List.Max"
da tbl_parameter ins Power Query über eine Tabellenabfrage eingehölt wird, hat man in der Hand eine Sortierung zu vorzunehmen. Ich habe überlegt, das zu erwähnen, aber gedacht, dass es schon genug zu lesen gab :-)
Ob List.Last schneller ist als List.Max kann ich nicht testen. Eher Gefühl.

VG
Yal
Anzeige
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
01.03.2024 04:01:40
Luschi
Hallo Yal,

na da sind wir uns doch einig und nicht wenige, die unsere beiden Beiträge lesen, denken sicher, wir unterhalten uns über 'bömische Dörfer'. Aber gerade hier wird PQ-M doch erst richtig interessant,
Leider gibt es nicht viel deutsche Literatur, die diese Zusammenhänge besser erklären. So bin ich von dem Buch 'Daten abfragen und verarbeiten mit Excel und Power BI' von Ignaz A. Schels 2. Auflage (Hansa Verlag 2023) nicht gerade begeisterst:
- zuviel blabla drumrum
- und keine Lösungsdateien
- nur die Beschreibungen, die Lösung zu erreichen
- beim Nachvollziehen (was aber viel Zeit kostet) gab es dann aber doch den 1 oder anderen Schmankerl

Gruß von Luschi
aus klein-Paris
l
Anzeige
PowerQuery für Fortgeschrittenen
01.03.2024 11:20:18
Yal
Hallo Luschi,

ja, es ist leider so, dass viele Anwender schon vorher von PQ erschreckt werden. Schade, man sollte die "Power" auf alle Fälle erleben.

Ich habe das Vorteil, dass ich im Netz auch englische Seiten abkupfern kann.
Seitens Buch habe ich dieses vom dpunkt-Verlag entdeckt. dpunkt ist selten "nur Anfänger". Der Author ist derjenige, der Power Query ins Excel reingebracht hat.
https://books.google.de/books/about/Power_Query.html?id=VsDYDwAAQBAJ

VG
Yal
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 13:12:52
captainkeksxx
Im Datenmodell habe ich es hinbekommen.

Eine neue Spalte hinzufügen (Name: Bereich) und die DAX-Formel dazu:



=
VAR G_M0_Wert = calculation_full[G_M0]
VAR Einstrahlung_Wert =
FLOOR(G_M0_Wert / 10; 1) * 10
VAR Next_Einstrahlung =
CALCULATE(
MIN(tbl_parameter[Einstrahlung]);
tbl_parameter[Einstrahlung] >= Einstrahlung_Wert
)
RETURN
LOOKUPVALUE(
tbl_parameter[Bereich];
tbl_parameter[Einstrahlung]; Next_Einstrahlung
)
Anzeige
AW: PowerQuery Custom Column: Match Function zu anderer Tabelle.
29.02.2024 15:16:59
captainkeksxx
UPDATE: Das letzte Beispiel mit DAX funktioniert lediglich, wenn die Bereiche gleich Groß verteilt sind. Um das ganze dynmischer zu gestalten um auch individuelle Bereiche zu berücksichtigen z.B. 0-19, 20-99, 100-399, 400-499, 500-
Ist diese DAX-Formel besser:

= 

VAR G_M0_Wert = calculation_full[G_M0]
VAR Einstrahlung_Wert =
MAXX(
FILTER(
tbl_parameter;
tbl_parameter[Einstrahlung] G_M0_Wert
); [Einstrahlung]
)
RETURN
LOOKUPVALUE(
tbl_parameter[Bereich];
tbl_parameter[Einstrahlung]; Einstrahlung_Wert
)
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige