Combinaison de données de plusieurs tablesJ'essaye de créer une nouvelle table principale en combinant les données de deux tables (ou plus). À titre d'exemple, j'essaie de combiner les tableaux A et B ci-dessous dans le tableau AB comme résultat:



Fondamentalement, les deux tableaux A et B ont une colonne similaire dans «début» et «fin», mais une plage différente pour chaque ligne. Ce que j'essaie de faire, c'est de combiner les segments de la distance de départ 1 à 20 des deux tableaux et de les combiner dans le tableau AB.
Une idée sur la façon de faire cela par le biais de scripts ou des fonctions Tables?
Tableau de donnéesScriptingRe: Combiner des données de plusieurs tablesCela peut donner une idée de la façon dont vous pourriez faire cela avec des scripts:
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);Re: Combiner des données de plusieurs tablesVous pouvez également vous attaquer à cela avec la version JSL d'une table-lookup, en utilisant Loc Sorted ().
Acclamations,
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: Combiner des données de plusieurs tables@jthi & @brady_brady Merci pour les réponses. Je suis sûr que les solutions proposées fonctionnent, mais je veux d'abord les digérer et je répondrai ici si elles répondent à mon intention. Appréciez l'aide! Vous tenir au courant.
Re: Combiner des données de plusieurs tablesAprès réflexion, j'ai trouvé un moyen de le faire de manière interactive. Plutôt que de le décrire, j'ai joint une courte vidéo que j'ai faite qui traite du processus. L'approche interactive a l'avantage qu'il s'agit de la même quantité de travail (ce qui n'est pas beaucoup), quel que soit le nombre de tables que vous souhaitez combiner. Dans mon exemple, j'utilise 3. L'inconvénient est qu'il nécessite un tri non intuitif; si vous faites une erreur de tri, vous obtiendrez des résultats incorrects.
Exécutez ce script pour générer les tables que j'utilise dans l'exemple:
Names Default To Here(1);
dta = new table("A",
<<ADDROWS></ADDROWS>