Kombinieren von Daten aus mehreren TabellenIch versuche, eine neue Mastertabelle zu erstellen, indem ich Daten aus zwei (oder mehr) Tabellen kombiniere. Als Beispiel versuche ich, die folgenden Tabellen A und B zu Tabelle AB zu kombinieren, was als Ergebnis herauskommt:



Grundsätzlich haben sowohl Tabelle A als auch Tabelle B ähnliche Spalten für „Start“ und „Ende“, aber unterschiedliche Bereiche für jede Zeile. Ich versuche, die Segmente von Startabstand 1 bis 20 aus beiden Tabellen zu kombinieren und sie in Tabelle AB zusammenzufassen.
Irgendeine Idee, wie dies entweder über Skripting oder die Tabellenfunktionen funktioniert?
Erweiterte statistische ModellierungAutomatisierung und SkriptingInhaltsorganisationMassenanpassungErgebnisse teilen und kommunizierenRe: 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 ich gemacht habe und das den Prozess bespricht. Der interaktive Ansatz hat den Vorteil, dass es der gleiche Arbeitsaufwand ist (was nicht viel ist), egal wie viele Tabellen Sie kombinieren möchten. In meinem Beispiel verwende ich 3. Der Nachteil ist, dass es eine nicht intuitive Sortierung erfordert; 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>Re: 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.
Re: Kombinieren von Daten aus mehreren TabellenBEARBEITEN: Ich habe dies neu geschrieben, um es viel kürzer, effizienter und frei von den ganzzahlbasierten Einschränkungen meiner ursprünglichen Antwort zu machen. Es ist auch einfach, den Code so anzupassen, dass er mehr als 2 Quelltabellen verarbeiten kann.
////
Sie können dies auch mit der JSL-Version einer Tabellensuche angehen, indem Sie Loc Sorted() verwenden.
Beifall,
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>
Re: Kombinieren von Daten aus mehreren TabellenDies kann eine Vorstellung davon geben, wie Sie dies mit Skripten tun könnten:
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);