Combinaison de données provenant de plusieurs tablesJ'essaie 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 tables A et B ci-dessous dans la table AB comme résultat :



En gros, les tables A et B ont toutes deux des colonnes similaires 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 tables et de les combiner dans la table AB.
Une idée sur la façon de procéder via des scripts ou des fonctions Tables ?
Modélisation statistique avancéeAutomatisation et scriptsOrganisation du contenuPersonnalisation de massePartage et communication des résultatsRe : Combiner les 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 et 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>Re : Combiner les données de plusieurs tables@jthi & @brady_brady Merci pour les réponses. Je suis sûr que les solutions fournies 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 les données de plusieurs tablesEDIT : j'ai réécrit ceci pour le rendre beaucoup plus court, plus efficace et exempt des limitations basées sur les nombres entiers de ma réponse d'origine. Il est également simple d'adapter le code pour gérer plus de 2 tables source.
////
Vous pouvez également résoudre ce problème avec la version JSL d'une recherche de table, 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 les 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);