Come unisco le tabelle
Ho due tavoli, A e B. Voglio scrivere JSL che troverà tutte le righe in A il cui ID è rappresentato una o più volte in B, quindi aggiungere quelle righe a B per produrre una nuova tabella C.
Ad esempio, sia A:
ID | Dati | Giorno |
1 | Rosso | Sole |
2 | Arancia | lun |
2 | Giallo | Mar |
3 | Blu | mer |
4 | Indaco | gio |
4 | Viola | ven |
4 | Fucsia | Sab |
5 | Verde acqua | Sole |
6 | Nero | lun |
E sia questo B:
ID | Dati | Giorno |
6 | Acqua | Mar |
1 | Rosa | mer |
1 | Beige | gio |
4 | Bianco | ven |
9 | Oro | Sab |
10 | Argento | Sole |
Voglio che il codice generi una tabella C simile a questa (l'ordine delle righe non ha importanza):
ID | Dati | Giorno |
6 | Acqua | Mar |
1 | Rosa | mer |
1 | Beige | gio |
4 | Bianco | ven |
9 | Oro | Sab |
10 | Argento | Sole |
1 | Rosso | Sole |
4 | Indaco | gio |
4 | Viola | ven |
4 | Fucsia | Sab |
6 | Nero | lun |
Sembra semplice, ma mi sono confuso sul modo migliore per farlo. Il metodo dovrebbe scalare bene rispetto alla velocità e alla memoria per le tabelle A e B di > 1 milione di righe.
Re: Come unire le tabelleL'opzione dell'array associativo è piuttosto ordinata e non ho usato molto questo concetto, e mai come una sorta di alternativa a un join. L'opzione che utilizza il join è fantastica da vedere perché quello era l'approccio che stavo cercando di elaborare da solo, ma mi sono confuso.
Sono grato a entrambi per aver confermato che, sebbene relativamente semplice, questo non ha una soluzione "one-step" o unica.
Grazie a tutti e due!
John
Re: Come unire le tabelleL'opzione dell'array associativo è piuttosto ordinata e non ho usato molto questo concetto, e mai come una sorta di alternativa a un join. L'opzione che utilizza il join è fantastica da vedere perché quello era l'approccio che stavo cercando di elaborare da solo, ma mi sono confuso.
Sono grato a entrambi per aver confermato che, sebbene relativamente semplice, questo non ha una soluzione "one-step" o unica.
Grazie a tutti e due!
John
Re: Come unire le tabelleEcco una versione incentrata su Join di uno script che funzionerà... dovrebbe essere abbastanza efficiente
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: Come unire le tabellePenso che questo dovrebbe essere relativamente efficiente dal punto di vista computazionale e non puoi farlo esattamente in questo modo.L'idea di base è creare una tabella che sia un sottoinsieme della tabella A in cui gli ID si trovano anche nella tabella B. Quindi concatenare il sottoinsieme di A alla tabella 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);Un altro approccio potrebbe essere quello di nascondere ed escludere i dati che non corrispondono ai criteri.Ciò elimina la necessità di creare una tabella di sottoinsieme, ma i dati nascosti ed esclusi vengono con la concatenazione.È possibile selezionare le righe nascoste ed escluse ed eliminarle, ma potrebbe non essere una soluzione molto solida se si dispone di altre righe nascoste ed escluse che non si desidera eliminare.
La terza opzione è creare una formula di colonna che indichi se la riga in A ha un ID che esiste in B, quindi eliminare le righe risultanti in C che non corrispondono in base ai valori in quella colonna.
Sono sicuro che ci sono molti altri modi per scuoiare questo gatto, ma spero che questo faccia il trucco.