Actualización de tabla con obtener filasHola,
Tengo dos tablas con> 50k filas y 5 -10 columnas y quiero actualizar la primera tabla (dt1) con los valores de la segunda tabla (dt2). No quiero usar bucles porque podría tomar mucho tiempo con filas> 50k. La función "actualizar" JSL funciona bien, pero también necesito las filas coincidentes en dt2 para su uso posterior.
Para mostrar lo que quiero decir, utilicé el ejemplo de "actualización" del "índice de secuencia de comandos" y agregué el nombre MIKE con altura, peso, rango y código. Necesito una lista con el número de filas coincidentes. Para ese ejemplo, sería {1, 2, 3} porque MIKE no existe en 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} )
);Gracias
Re: Actualización de tabla con obtener filasAquí hay una manera que podría funcionar para usted asumiendo que el nombre actúa como un identificador único:
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);Re: Actualización de tabla con obtener filasLe sugiero que use una combinación en lugar de la actualización. Si se configura correctamente, funcionará como la Actualización, pero agregará nuevas filas. También le proporcionará una columna que le indicará qué filas se agregaron.
El inconveniente es que crea una nueva tabla de datos, pero con un par de declaraciones, que pueden tratarse, y se verá y se sentirá como si se hubiera realizado una actualización. Mira el código a continuación:
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: Actualización de tabla con obtener filasGracias, esto funciona bien, también para una gran cantidad de filas.Re: Actualización de tabla con obtener filasGracias, probé este enfoque, pero para más de 50k filas tomará demasiado tiempo. Para tablas más pequeñas esto funciona bien.