Wie kombiniere ich Tabellen?
Ich habe zwei Tische, A und B. Ich möchte eine JSL schreiben, die alle Zeilen in A findet, deren ID ein oder mehrere Male in B vertreten ist, und diese Zeilen dann an B anhängen, um eine neue Tabelle C zu erhalten.
Dies sei zum Beispiel A:
AUSWEIS | Daten | Tag |
1 | Rot | Sonne |
2 | Orange | Mo |
2 | Gelb | Di |
3 | Blau | Heiraten |
4 | Indigo | Do |
4 | Violett | Fr |
4 | Fuchsie | Sa |
5 | Blaugrün | Sonne |
6 | Schwarz | Mo |
Und das sei B:
AUSWEIS | Daten | Tag |
6 | Aqua | Di |
1 | Rosa | Heiraten |
1 | Beige | Do |
4 | Weiß | Fr |
9 | Gold | Sa |
10 | Silber | Sonne |
Ich möchte, dass Code eine Tabelle C generiert, die so aussieht (Reihenfolge spielt keine Rolle):
AUSWEIS | Daten | Tag |
6 | Aqua | Di |
1 | Rosa | Heiraten |
1 | Beige | Do |
4 | Weiß | Fr |
9 | Gold | Sa |
10 | Silber | Sonne |
1 | Rot | Sonne |
4 | Indigo | Do |
4 | Violett | Fr |
4 | Fuchsie | Sa |
6 | Schwarz | Mo |
Das scheint einfach zu sein, aber ich bin mir nicht sicher, wie ich das am besten machen soll. Die Methode sollte hinsichtlich Geschwindigkeit und Speicher für A- und B-Tabellen mit mehr als 1 Million Zeilen gut skalierbar sein.
Betreff: Wie kombiniere ich Tabellen?Die assoziative Array-Option ist ziemlich nett und ich habe dieses Konzept nicht oft verwendet und auch nie als eine Art Alternative zu einem Join. Die Möglichkeit, den Join zu verwenden, ist toll zu sehen, denn das war der Ansatz, den ich selbst zu erarbeiten versuchte, aber verwirrt war.
Ich bin Ihnen beiden dankbar, dass Sie bestätigt haben, dass dies zwar relativ einfach ist, es aber keine „einstufige“ oder einzigartige Lösung gibt.
Danke euch beiden!
John
Betreff: Wie kombiniere ich Tabellen?Die assoziative Array-Option ist ziemlich nett und ich habe dieses Konzept nicht oft verwendet und auch nie als eine Art Alternative zu einem Join. Die Möglichkeit, den Join zu verwenden, ist toll zu sehen, denn das war der Ansatz, den ich selbst zu erarbeiten versuchte, aber verwirrt war.
Ich bin Ihnen beiden dankbar, dass Sie bestätigt haben, dass dies zwar relativ einfach ist, es aber keine „einstufige“ oder einzigartige Lösung gibt.
Danke euch beiden!
John
Betreff: Wie kombiniere ich Tabellen?Hier ist eine Join-zentrierte Version eines Skripts, das funktionieren wird ... es sollte ziemlich effizient sein
names default to here(1);
dtA = data table("A");
dtB = data table("B");
// Create data tables with only the data required
dtAID = dtA << Subset(invisible, selected rows(0), columns(:ID));
dtBID = dtB << Subset(invisible, selected rows(0), columns(:ID));
// Create a data table with only IDs found in both tables
dtABID = dtAID << Join(invisible, with(dtBID ),
Merge Same Name Columns,
By Matching Columns( :ID = :ID ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
);
close( dtAID, nosave );
close( dtBID, nosave );
// Create a table with only 1 row for each ID found
dtSum = dtABID << Summary(invisible,
Group( :ID ),
Freq( "None" ),
Weight( "None" )
);
// Create a data table that only has the correct IDs
// from data table A
dtAMatches = dtA << Join(invisible,
with(dtSum ),
Merge Same Name Columns,
By Matching Columns( :ID = :ID ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
);
close( dtSum, nosave );
// Delete column Match Flag and N Rows
dtAMatches << delete columns("Match Flag", "N Rows");
// Concatenate table B with the matched data from table A
dtFinal = dtB << Concatenate( dtAMatches );
close( dtAMatches, nosave );
Betreff: Wie kombiniere ich Tabellen?Ich denke, dass dies relativ recheneffizient sein sollte und dass Sie es nicht genau auf diese Weise tun müssen.Die Grundidee besteht darin, eine Tabelle zu erstellen, die eine Teilmenge von Tabelle A ist, in der sich die IDs auch in Tabelle B befinden. Anschließend wird die Teilmenge von A mit Tabelle B verkettet.
dtA = Data Table("Table A");
dtB = Data Table("Table B");
b.ID = dtB:ID << Get Values;
b_ID_unique = associative array(b.ID) << Get Keys;
dtA << Select Where(Contains(b_ID_unique,:ID) > 0);
dtASelected = dtA << Subset( Selected Rows );
dtB << Concatenate(
dtASelected,
Output Table( "Table C" )
);
Close(dtASelected, No Save);Ein anderer Ansatz könnte darin bestehen, die Daten auszublenden und auszuschließen, die nicht den Kriterien entsprechen.Dadurch entfällt die Notwendigkeit, eine Teilmengentabelle zu erstellen, aber die ausgeblendeten und ausgeschlossenen Daten gehen mit der Verkettung einher.Sie könnten die ausgeblendeten und ausgeschlossenen Zeilen auswählen und löschen, aber das ist möglicherweise keine sehr robuste Lösung, wenn Sie andere ausgeblendete und ausgeschlossene Zeilen haben, die Sie nicht löschen möchten.
Die dritte Option besteht darin, eine Spaltenformel zu erstellen, die angibt, ob Zeile in A eine ID hat, die in B vorhanden ist, und dann die resultierenden Zeilen in C zu löschen, die nicht mit den Werten in dieser Spalte übereinstimmen.
Ich bin mir sicher, dass es zahlreiche andere Möglichkeiten gibt, diese Katze zu häuten, aber ich hoffe, dass dies den Zweck erfüllt.