Combinazione di dati da più tabelleSto cercando di creare una nuova tabella master combinando i dati di due tabelle (o più). Ad esempio, sto cercando di combinare la Tabella A e la Tabella B qui sotto nella Tabella AB come risultato:



Fondamentalmente sia la tabella A che la tabella B hanno colonne simili in "start" e "end" ma range diversi per ogni riga. Quello che sto cercando di fare è combinare i segmenti dalla distanza iniziale 1 a 20 da entrambe le tabelle e combinarli nella tabella AB.
Avete qualche idea su come farlo tramite script o tramite le funzioni Tables?
Modellazione statistica avanzataAutomazione e scriptingOrganizzazione dei contenutiPersonalizzazione di massaCondivisione e comunicazione dei risultatiRe: Combinazione di dati da più tabelleDopo qualche riflessione, ho trovato un modo per farlo in modo interattivo. Invece di descriverlo, ho allegato un breve video che ho realizzato che discute il processo. L'approccio interattivo ha il vantaggio che è la stessa quantità di lavoro (che non è molto) indipendentemente dal numero di tabelle che desideri combinare. Nel mio esempio, utilizzo 3. Lo svantaggio è che richiede un ordinamento non intuitivo; se commetti un errore nell'ordinamento, otterrai risultati errati.
Esegui questo script per generare le tabelle che utilizzo nell'esempio:
Names Default To Here(1);
dta = new table("A",
<<ADDROWS></ADDROWS>Re: Combinazione di dati da più tabelle@jthi & @brady_brady Grazie per le risposte. Sono sicuro che le soluzioni fornite funzionano, ma prima voglio digerirle e risponderò qui se soddisfano il mio intento. Apprezzo l'aiuto! Tenervi aggiornati.
Re: Combinazione di dati da più tabelleEDIT: l'ho riscritto per renderlo molto più breve, più efficiente e privo delle limitazioni basate sui numeri interi della mia risposta originale. È anche semplice adattare il codice per gestire più di 2 tabelle di origine.
////
Puoi anche affrontare questo problema con la versione JSL di una ricerca tabellare, usando Loc Sorted().
Saluti,
Brady
Names Default To Here( 1 );
dt1 = New Table( "Table A",
Add Rows( 4 ),
Compress File When Saved( 1 ),
New Column( "Start", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 10, 15] ) ),
New Column( "End", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [5, 10, 15, 20] ) ),
New Column( "Name", Character, "Nominal", Set Values( {"A", "B", "C", "D"} ) )
);
dt2 = New Table( "Table B",
Add Rows( 5 ),
Compress File When Saved( 1 ),
New Column( "Start", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 4, 8, 12, 16] ) ),
New Column( "End", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12, 16, 20] ) ),
New Column( "Name", Character, "Nominal", Set Values( {"X1", "X2", "X3", "X4", "X5"} ) )
);
//////////// Begin processing here...
ends = Matrix( Associative Array( Concat( As List( dt1:End << get values ), As List( dt2:End << get values ) ) ) << get keys );
starts = [1] |/ ends[1 :: (N Row( ends ) - 1)];
dt3 = As Table( starts || ends, <<COLUMN names=""></COLUMN>
Re: Combinazione di dati da più tabelleQuesto può dare un'idea di come potresti farlo con lo scripting:
Names Default To Here(1);
dt1 = New Table("Table A",
Add Rows(4),
Compress File When Saved(1),
New Column("Start",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 5, 10, 15])
),
New Column("End",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([5, 10, 15, 20])
),
New Column("Name", Character, "Nominal", Set Values({"A", "B", "C", "D"}))
);
dt2 = New Table("Table B",
Add Rows(5),
Compress File When Saved(1),
New Column("Start",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 4, 8, 12, 16])
),
New Column("End",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([4, 8, 12, 16, 20])
),
New Column("Name",
Character,
"Nominal",
Set Values({"X1", "X2", "X3", "X4", "X5"})
)
);
//create collection table
dt_final = New Table("Table A-B",
Compress File When Saved(1),
New Column("Start", Numeric, "Continuous", Format("Best", 12)),
New Column("End", Numeric, "Continuous", Format("Best", 12)),
New Column("Name", Character, "Nominal")
);
For Each Row(dt1,
startVal = Column(dt1, "Start")[Row()];
endVal = Column(dt1, "End")[Row()];
nameVal = Column(dt1, "Name")[Row()];
r_dt2 = dt2 << get rows where(startVal <= :Start <= endVal | startVal <= :End <= endVal);
For(i = 1, i <= N Items(r_dt2), i++,
newEnd = Min(Column(dt2, "End")[r_dt2[i]], endVal);
newName = nameVal || " " ||Column(dt2, "Name")[r_dt2[i]];
newRow = EvalList({startVal, newEnd, newName});
dt_final << Add rows({Start = newRow[1], End = newRow[2], Name = newRow[3]});
startVal = newEnd;
endVal= Max(Column(dt2, "End")[r_dt2[i]], endVal);
);
);
Close(dt1, no save);
Close(dt2, no save);