Daten aus mehreren Tabellen kombinierenIch versuche, eine neue Mastertabelle zu erstellen, indem ich Daten aus zwei Tabellen (oder mehr) kombiniere. Als Beispiel versuche ich, Tabelle A und Tabelle B als Ergebnis in Tabelle AB zu kombinieren:



Grundsätzlich haben beide Tabellen A und B eine ähnliche Spalte in "Start" und "Ende", aber unterschiedliche Bereiche für jede Zeile. Ich versuche, die Segmente vom Startabstand 1 bis 20 von beiden Tabellen zu kombinieren und sie in Tabelle AB zu kombinieren.
Haben Sie eine Idee, wie Sie dies entweder über Skripte oder über die Tabellenfunktionen tun können?
DatentabelleSkriptingBetreff: Kombinieren von Daten aus mehreren TabellenDies kann eine Vorstellung davon geben, wie Sie dies mit Skripten tun können:
Names Default To Here(1);
dt1 = New Table("Table A",
Add Rows(4),
Compress File When Saved(1),
New Column("Start",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 5, 10, 15])
),
New Column("End",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([5, 10, 15, 20])
),
New Column("Name", Character, "Nominal", Set Values({"A", "B", "C", "D"}))
);
dt2 = New Table("Table B",
Add Rows(5),
Compress File When Saved(1),
New Column("Start",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 4, 8, 12, 16])
),
New Column("End",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([4, 8, 12, 16, 20])
),
New Column("Name",
Character,
"Nominal",
Set Values({"X1", "X2", "X3", "X4", "X5"})
)
);
//create collection table
dt_final = New Table("Table A-B",
Compress File When Saved(1),
New Column("Start", Numeric, "Continuous", Format("Best", 12)),
New Column("End", Numeric, "Continuous", Format("Best", 12)),
New Column("Name", Character, "Nominal")
);
For Each Row(dt1,
startVal = Column(dt1, "Start")[Row()];
endVal = Column(dt1, "End")[Row()];
nameVal = Column(dt1, "Name")[Row()];
r_dt2 = dt2 << get rows where(startVal <= :Start <= endVal | startVal <= :End <= endVal);
For(i = 1, i <= N Items(r_dt2), i++,
newEnd = Min(Column(dt2, "End")[r_dt2[i]], endVal);
newName = nameVal || " " ||Column(dt2, "Name")[r_dt2[i]];
newRow = EvalList({startVal, newEnd, newName});
dt_final << Add rows({Start = newRow[1], End = newRow[2], Name = newRow[3]});
startVal = newEnd;
endVal= Max(Column(dt2, "End")[r_dt2[i]], endVal);
);
);
Close(dt1, no save);
Close(dt2, no save);Betreff: Kombinieren von Daten aus mehreren TabellenSie können dies auch mit der JSL-Version einer Tabellensuche unter Verwendung von Loc Sorted () beheben.
Prost,
Brady
Names Default To Here( 1 );
dt1 = New Table( "Table A",
Add Rows( 4 ),
Compress File When Saved( 1 ),
New Column( "Start", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 10, 15] ) ),
New Column( "End", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [5, 10, 15, 20] ) ),
New Column( "Name", Character, "Nominal", Set Values( {"A", "B", "C", "D"} ) )
);
dt2 = New Table( "Table B",
Add Rows( 5 ),
Compress File When Saved( 1 ),
New Column( "Start", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 4, 8, 12, 16] ) ),
New Column( "End", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12, 16, 20] ) ),
New Column( "Name", Character, "Nominal", Set Values( {"X1", "X2", "X3", "X4", "X5"} ) )
);
//////////// Begin processing here...
ends = Matrix( Associative Array( Concat( As List( dt1:End << get values ), As List( dt2:End << get values ) ) ) << get keys );
starts = [1] |/ ends[1 :: (N Row( ends ) - 1)];
dt3 = As Table( starts || ends, <<COLUMN names=""></COLUMN>Betreff: Kombinieren von Daten aus mehreren Tabellen@jthi & @brady_brady Danke für die Antworten. Ich bin mir sicher, dass die bereitgestellten Lösungen funktionieren, aber ich möchte sie zuerst verdauen und werde hier antworten, wenn sie meiner Absicht entsprechen. Schätzen Sie die Hilfe! Auf dem Laufenden halten.
Betreff: Kombinieren von Daten aus mehreren TabellenNach einigem Nachdenken fand ich einen Weg, dies interaktiv zu tun. Anstatt es zu beschreiben, habe ich ein kurzes Video angehängt, das den Prozess beschreibt. Der interaktive Ansatz hat den Vorteil, dass unabhängig von der Anzahl der zu kombinierenden Tabellen derselbe Arbeitsaufwand (der nicht viel ist) erforderlich ist. In meinem Beispiel verwende ich 3. Der Nachteil ist, dass eine nicht intuitive Sortierung erforderlich ist. Wenn Sie beim Sortieren einen Fehler machen, erhalten Sie falsche Ergebnisse.
Führen Sie dieses Skript aus, um die Tabellen zu generieren, die ich im Beispiel verwende:
Names Default To Here(1);
dta = new table("A",
<<ADDROWS></ADDROWS>