Tabellenaktualisierung mit Get-ZeilenHallo,
Ich habe zwei Tabellen mit > 50.000 Zeilen und 5–10 Spalten und möchte die erste Tabelle (dt1) mit Werten aus der zweiten Tabelle (dt2) aktualisieren. Ich möchte keine Schleifen verwenden, da dies bei Zeilen > 50.000 sehr lange dauern kann. Die JSL-Funktion „Update“ funktioniert gut, aber ich benötige auch die übereinstimmenden Zeilen in dt2 zur weiteren Verwendung.
Um zu zeigen, was ich meine, habe ich das „Update“-Beispiel aus „script index“ verwendet und den Namen MIKE mit Größe, Gewicht, Rang und Code hinzugefügt. Ich benötige eine Liste mit der Zeilennummer der übereinstimmenden Zeilen. In diesem Beispiel wäre es {1, 2, 3}, da MIKE in dt1 nicht vorhanden ist.
Names Default To Here( 1 );
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "Little Class",
Add Rows( 3 ),
New Column( "name", Character, Nominal, Set Values( {"KATIE", "ALFRED", "HENRY", "MIKE"} ) ),
New Column( "height", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "weight", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "RANK", Continuous, Set Values( [3, 1, 2, 9] ) ),
New Column( "CODE", Continuous, Set Values( [0, 1, 1, 8] ) )
);
dt1 << Update(
With( Data Table( "Little Class" ) ),
Match Columns( :name = :name ),
Add columns from Update table( {:RANK} ),
Replace columns in Main Table( {:height} )
);Danke
Betreff: Tabellenaktualisierung mit Get-ZeilenDanke, ich habe diesen Ansatz ausprobiert, aber für mehr als 50.000 Zeilen wird es zu lange dauern. Bei kleineren Tischen funktioniert das gut.Betreff: Tabellenaktualisierung mit Get-ZeilenDanke, das funktioniert gut, auch bei einer großen Anzahl von Zeilen.Betreff: Tabellenaktualisierung mit Get-ZeilenIch schlage vor, dass Sie einen Join anstelle des Updates verwenden.Bei korrekter Einrichtung funktioniert es wie das Update, fügt jedoch neue Zeilen hinzu.Außerdem erhalten Sie eine Spalte, die angibt, welche Zeilen hinzugefügt wurden.
Der Nachteil besteht darin, dass eine neue Datentabelle erstellt wird, die jedoch mit ein paar Anweisungen bearbeitet werden kann und das Aussehen und Verhalten so aussieht, als wäre eine Aktualisierung durchgeführt worden.Schauen Sie sich den folgenden Code an:
Names Default To Here( 1 );
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "Little Class",
Add Rows( 3 ),
New Column( "name", Character, Nominal, Set Values( {"KATIE", "ALFRED", "HENRY", "MIKE"} ) ),
New Column( "height", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "weight", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "RANK", Continuous, Set Values( [3, 1, 2, 9] ) ),
New Column( "CODE", Continuous, Set Values( [0, 1, 1, 8] ) )
);
dt3 = dt1 << Join(
With( dt2),
Merge Same Name Columns,
By Matching Columns( :name = :name ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 1 ),
Preserve main table order( 1 )
);
name = dt1 << get name;
close(dt1, nosave );
dt3 << set name(name);
dt1 = dt3;Betreff: Tabellenaktualisierung mit Get-ZeilenHier ist eine Möglichkeit, die für Sie funktionieren könnte, vorausgesetzt, der Name fungiert als eindeutige Kennung:
Names Default To Here( 1 );
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "Little Class",
Add Rows( 3 ),
New Column( "name", Character, Nominal, Set Values( {"KATIE", "ALFRED", "HENRY", "MIKE"} ) ),
New Column( "height", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "weight", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "RANK", Continuous, Set Values( [3, 1, 2, 9] ) ),
New Column( "CODE", Continuous, Set Values( [0, 1, 1, 8] ) )
);
dt1 << Update(
With( Data Table( "Little Class" ) ),
Match Columns( :name = :name ),
Add columns from Update table( {:RANK} ),
Replace columns in Main Table( {:height} )
);
//Get names as associative arrays
names1 = Associative Array(dt1:name << Get values);
names2 = Associative Array(dt2:name << Get Values);
//Get the intersection (replaces names1)
names1 << Intersect(names2);
//Get intersection names as List
intersection = names1 << Get Keys;
//Find rows
update_rows = dt2 << Get Rows Where(contains(intersection, :name)>0);