Comment combiner des tables
J'ai deux tables, A et B. Je veux écrire JSL qui trouvera toutes les lignes dans A dont l'ID est représenté une ou plusieurs fois dans B, puis ajouter ces lignes à B pour générer une nouvelle table C.
Par exemple, soit A :
IDENTIFIANT | Données | Jour |
1 | Rouge | Soleil |
2 | Orange | Lun |
2 | Jaune | Mar |
3 | Bleu | Épouser |
4 | Indigo | Jeu |
4 | Violet | Ven |
4 | Fuchsia | Assis |
5 | Sarcelle | Soleil |
6 | Noir | Lun |
Et que ce soit B :
IDENTIFIANT | Données | Jour |
6 | Aqua | Mar |
1 | Rose | Épouser |
1 | Beige | Jeu |
4 | Blanc | Ven |
9 | Or | Assis |
dix | Argent | Soleil |
Je veux que le code génère une table C qui ressemble à ceci (l'ordre des lignes n'a pas d'importance):
IDENTIFIANT | Données | Jour |
6 | Aqua | Mar |
1 | Rose | Épouser |
1 | Beige | Jeu |
4 | Blanc | Ven |
9 | Or | Assis |
dix | Argent | Soleil |
1 | Rouge | Soleil |
4 | Indigo | Jeu |
4 | Violet | Ven |
4 | Fuchsia | Assis |
6 | Noir | Lun |
Cela semble simple, mais je me suis perdu quant à la meilleure façon de le faire. La méthode doit bien évoluer en termes de vitesse et de mémoire pour les tables A et B de > 1 million de lignes.
Re : Comment combiner des tableauxL'option de tableau associatif est assez soignée et je n'ai pas beaucoup utilisé ce concept, et jamais comme une sorte d'alternative à une jointure. L'option utilisant la jointure est géniale à voir parce que c'était l'approche que j'essayais de développer pour moi-même, mais je me suis trompée.
Je vous suis reconnaissant à tous les deux d'avoir confirmé que, bien que relativement simple, cela n'a pas de solution "en une étape" ou unique.
Merci à vous deux!
John
Re : Comment combiner des tableauxL'option de tableau associatif est assez soignée et je n'ai pas beaucoup utilisé ce concept, et jamais comme une sorte d'alternative à une jointure. L'option utilisant la jointure est géniale à voir parce que c'était l'approche que j'essayais de développer pour moi-même, mais je me suis trompée.
Je vous suis reconnaissant à tous les deux d'avoir confirmé que, bien que relativement simple, cela n'a pas de solution "en une étape" ou unique.
Merci à vous deux!
John
Re : Comment combiner des tableauxVoici une version centrée sur la jointure d'un script qui fonctionnera... ça devrait être assez efficace
names default to here(1);
dtA = data table("A");
dtB = data table("B");
// Create data tables with only the data required
dtAID = dtA << Subset(invisible, selected rows(0), columns(:ID));
dtBID = dtB << Subset(invisible, selected rows(0), columns(:ID));
// Create a data table with only IDs found in both tables
dtABID = dtAID << Join(invisible, with(dtBID ),
Merge Same Name Columns,
By Matching Columns( :ID = :ID ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
);
close( dtAID, nosave );
close( dtBID, nosave );
// Create a table with only 1 row for each ID found
dtSum = dtABID << Summary(invisible,
Group( :ID ),
Freq( "None" ),
Weight( "None" )
);
// Create a data table that only has the correct IDs
// from data table A
dtAMatches = dtA << Join(invisible,
with(dtSum ),
Merge Same Name Columns,
By Matching Columns( :ID = :ID ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
);
close( dtSum, nosave );
// Delete column Match Flag and N Rows
dtAMatches << delete columns("Match Flag", "N Rows");
// Concatenate table B with the matched data from table A
dtFinal = dtB << Concatenate( dtAMatches );
close( dtAMatches, nosave );
Re : Comment combiner des tableauxJe pense que cela devrait être relativement efficace en termes de calcul, et vous ne pouvez pas avoir à le faire exactement de cette façon.L'idée de base est de créer une table qui est un sous-ensemble de la table A où les ID sont également dans la table B. Ensuite, concaténez le sous-ensemble de A à la table B.
dtA = Data Table("Table A");
dtB = Data Table("Table B");
b.ID = dtB:ID << Get Values;
b_ID_unique = associative array(b.ID) << Get Keys;
dtA << Select Where(Contains(b_ID_unique,:ID) > 0);
dtASelected = dtA << Subset( Selected Rows );
dtB << Concatenate(
dtASelected,
Output Table( "Table C" )
);
Close(dtASelected, No Save);Une autre approche peut consister à masquer et à exclure les données qui ne correspondent pas aux critères.Cela élimine le besoin de créer une table de sous-ensemble, mais les données masquées et exclues accompagnent la concaténation.Vous pouvez sélectionner les lignes masquées et exclues et les supprimer, mais ce n'est peut-être pas une solution très robuste si vous avez d'autres lignes masquées et exclues que vous ne voudriez pas supprimer.
La troisième option consiste à créer une formule de colonne indiquant si la ligne dans A a un ID qui existe dans B, puis supprimez les lignes résultantes dans C qui ne correspondent pas en fonction des valeurs de cette colonne.
Je suis sûr qu'il existe de nombreuses autres façons d'écorcher ce chat, mais j'espère que cela fera l'affaire.