¿Cómo combino tablas?
Tengo dos mesas, A y B. Quiero escribir JSL que encuentre todas las filas en A cuyo ID se representa una o más veces en B, y luego agregar esas filas a B para generar una nueva tabla C.
Por ejemplo, sea esto A:
IDENTIFICACIÓN | Datos | Día |
1 | Rojo | Sol |
2 | Naranja | Lun |
2 | Amarillo | Mar |
3 | Azul | Casarse |
4 | Índigo | Jue |
4 | Violeta | Vie |
4 | Fucsia | Se sentó |
5 | verde azulado | Sol |
6 | Negro | Lun |
Y que esto sea B:
IDENTIFICACIÓN | Datos | Día |
6 | Agua | Mar |
1 | Rosa | Casarse |
1 | Beige | Jue |
4 | Blanco | Vie |
9 | Oro | Se sentó |
10 | Plata | Sol |
Quiero un código para generar una tabla C que se vea así (el orden de las filas no importa):
IDENTIFICACIÓN | Datos | Día |
6 | Agua | Mar |
1 | Rosa | Casarse |
1 | Beige | Jue |
4 | Blanco | Vie |
9 | Oro | Se sentó |
10 | Plata | Sol |
1 | Rojo | Sol |
4 | Índigo | Jue |
4 | Violeta | Vie |
4 | Fucsia | Se sentó |
6 | Negro | Lun |
Esto parece simple, pero me he confundido en cuanto a la mejor manera de hacerlo. El método debería escalar bien con respecto a la velocidad y la memoria para las tablas A y B de >1 millón de filas.
Re: ¿Cómo combino tablas?La opción de matriz asociativa es bastante ordenada y no he usado mucho este concepto, y nunca como una especie de alternativa a una unión. Es genial ver la opción de usar la unión porque ese era el enfoque que estaba tratando de resolver por mí mismo, pero me confundí.
Les agradezco a ambos por confirmar que, si bien es relativamente sencillo, esto no tiene una solución única o de "un solo paso".
¡Gracias a los dos!
John
Re: ¿Cómo combino tablas?La opción de matriz asociativa es bastante ordenada y no he usado mucho este concepto, y nunca como una especie de alternativa a una unión. Es genial ver la opción de usar la unión porque ese era el enfoque que estaba tratando de resolver por mí mismo, pero me confundí.
Les agradezco a ambos por confirmar que, si bien es relativamente simple, esto no tiene una solución única o de "un solo paso".
¡Gracias a los dos!
John
Re: ¿Cómo combino tablas?Aquí hay una versión centrada en Join de un script que funcionará... debería ser bastante eficiente
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: ¿Cómo combino tablas?Creo que esto debería ser relativamente eficiente desde el punto de vista computacional, y no es necesario que lo haga exactamente de esta manera.La idea básica es crear una tabla que sea un subconjunto de la Tabla A donde los ID también están en la Tabla B. Luego concatenar el subconjunto de A a la Tabla 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);Otro enfoque podría ser ocultar y excluir los datos que no coinciden con los criterios.Esto elimina la necesidad de crear una tabla de subconjuntos, pero los datos ocultos y excluidos vienen junto con la concatenación.Puede seleccionar las filas ocultas y excluidas y eliminarlas, pero esa podría no ser una solución muy sólida si tiene otras filas ocultas y excluidas que no desea eliminar.
La tercera opción es hacer una fórmula de columna que indique si la fila en A tiene una identificación que existe en B, luego eliminar las filas resultantes en C que no coinciden según los valores en esa columna.
Estoy seguro de que hay muchas otras formas de despellejar a este gato, pero espero que esto funcione.