Mise à jour de la table avec obtenir des lignesSalut,
J'ai deux tables avec> 50 000 lignes et 5 à 10 colonnes et je souhaite mettre à jour la première table (dt1) avec les valeurs de la deuxième table (dt2). Je ne veux pas utiliser de boucles car cela pourrait prendre beaucoup de temps avec des lignes> 50k. La fonction "mise à jour" JSL fonctionne bien mais j'ai également besoin des lignes correspondantes dans dt2 pour une utilisation ultérieure.
Pour montrer ce que je veux dire, j'ai utilisé l'exemple "mise à jour" de "script index" et j'ai ajouté le nom MIKE avec la taille, le poids, le rang et le code. J'ai besoin d'une liste avec le nombre de lignes de lignes correspondantes. Pour cet exemple, ce serait {1, 2, 3} car MIKE n'existe pas dans dt1.
Names Default To Here( 1 );
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "Little Class",
Add Rows( 3 ),
New Column( "name", Character, Nominal, Set Values( {"KATIE", "ALFRED", "HENRY", "MIKE"} ) ),
New Column( "height", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "weight", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "RANK", Continuous, Set Values( [3, 1, 2, 9] ) ),
New Column( "CODE", Continuous, Set Values( [0, 1, 1, 8] ) )
);
dt1 << Update(
With( Data Table( "Little Class" ) ),
Match Columns( :name = :name ),
Add columns from Update table( {:RANK} ),
Replace columns in Main Table( {:height} )
);Merci
Re : Mise à jour de la table avec obtenir des lignesMerci, j'ai essayé cette approche mais pour plus de 50 000 lignes, cela prendra trop de temps. Pour les petites tables, cela fonctionne bien.Re : Mise à jour de la table avec obtenir des lignesMerci, cela fonctionne bien, même pour un grand nombre de lignes.Re : Mise à jour de la table avec obtenir des lignesJe vous suggère d'utiliser une jointure au lieu de la mise à jour.S'il est correctement configuré, il fonctionnera comme la mise à jour, mais il ajoutera de nouvelles lignes.Il vous fournira également une colonne qui indiquera quelles lignes ont été ajoutées.
L'inconvénient est qu'il crée une nouvelle table de données, mais avec quelques déclarations, qui peuvent être traitées, et cela ressemblera à une mise à jour.Regardez le code ci-dessous :
Names Default To Here( 1 );
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "Little Class",
Add Rows( 3 ),
New Column( "name", Character, Nominal, Set Values( {"KATIE", "ALFRED", "HENRY", "MIKE"} ) ),
New Column( "height", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "weight", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "RANK", Continuous, Set Values( [3, 1, 2, 9] ) ),
New Column( "CODE", Continuous, Set Values( [0, 1, 1, 8] ) )
);
dt3 = dt1 << Join(
With( dt2),
Merge Same Name Columns,
By Matching Columns( :name = :name ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 1 ),
Preserve main table order( 1 )
);
name = dt1 << get name;
close(dt1, nosave );
dt3 << set name(name);
dt1 = dt3;Re : Mise à jour de la table avec obtenir des lignesVoici une méthode qui pourrait fonctionner pour vous en supposant que le nom agisse comme un identifiant unique :
Names Default To Here( 1 );
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "Little Class",
Add Rows( 3 ),
New Column( "name", Character, Nominal, Set Values( {"KATIE", "ALFRED", "HENRY", "MIKE"} ) ),
New Column( "height", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "weight", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "RANK", Continuous, Set Values( [3, 1, 2, 9] ) ),
New Column( "CODE", Continuous, Set Values( [0, 1, 1, 8] ) )
);
dt1 << Update(
With( Data Table( "Little Class" ) ),
Match Columns( :name = :name ),
Add columns from Update table( {:RANK} ),
Replace columns in Main Table( {:height} )
);
//Get names as associative arrays
names1 = Associative Array(dt1:name << Get values);
names2 = Associative Array(dt2:name << Get Values);
//Get the intersection (replaces names1)
names1 << Intersect(names2);
//Get intersection names as List
intersection = names1 << Get Keys;
//Find rows
update_rows = dt2 << Get Rows Where(contains(intersection, :name)>0);