Ciao a tutti,
Ho due dt e voglio creare una nuova colonna nel dt primario in base ai dati del dt secondario.
Voglio un comando JSL che controlli la data nella colonna "dt1" della data e corrisponda a un numero di gruppo da "dt2" basato sulla data di inizio e di fine. (lasso di tempo)
dt1: (primario)
| Data | Gruppo |
| 17/05/2019 13:06 | |
| 17/05/2019 13:06 | |
| 23/05/2019 10:02 | |
| 24/05/2019 13:47 | |
dt2: (secondario)
| Gruppo | data d'inizio | data di fine |
| 1 | 17/05/2019 20:15 | 17/05/2019 8:14 |
| 2 | 17/05/2019 8:15 | 17/05/2019 20:14 |
| 1 | 17/05/2019 20:15 | 5/19/2019 8:14 |
| 3 | 5/19/2019 8:15 | 19/05/2019 20:14 |
| 2 | 19/05/2019 20:15 | 20/05/2019 8:14 |
| 3 | 20/05/2019 8:15 | 20/05/2019 20:14 |
| 2 | 20/05/2019 20:15 | 5/21/2019 8:14 |
| 4 | 5/21/2019 8:15 | 21/05/2019 20:14 |
| 3 | 21/05/2019 20:15 | 22/05/2019 8:14 |
| 4 | 22/05/2019 8:15 | 22/05/2019 20:14 |
| 3 | 22/05/2019 20:15 | 23/05/2019 8:14 |
| 1 | 23/05/2019 8:15 | 23/05/2019 20:14 |
| 4 | 23/05/2019 20:15 | 24/05/2019 8:14 |
| 1 | 24/05/2019 8:15 | 24/05/2019 20:14 |
Il tuo aiuto sarà molto apprezzato.
Ciao @ileshem ,
Ci sono alcuni modi in cui vorrei fare questo. Un modo sarebbe quello di creare una tabella che elenchi i gruppi per ogni punto temporale tra la data di inizio e di fine, e quindi si potrebbe usare quella tabella con Tabelle> Aggiorna per inserire il numero del gruppo accoppiando direttamente sulla nuova colonna della data che si estende l'inizio e la fine Ciò implicherebbe la creazione di quella nuova tabella con spanning e, a seconda di quanti intervalli di date hai, quella tabella potrebbe diventare piuttosto grande.
Un'altra opzione (che in questo caso ho una preferenza) consiste nell'utilizzare Tabelle> Generatore di query JMP, che ci consentirà di stabilire un join che può utilizzare una logica SQL per stabilire dove una data è sia dopo una data di inizio che prima della data di fine. È possibile progettare questa query in modo interattivo, il che è uno dei motivi per cui mi piace questo approccio, quindi se non si voleva scrivere qualcosa, si poteva fare tutto con il mouse. Salvare i risultati dello script in alcuni jsl che non è troppo difficile da generalizzare, richiede solo alcuni trucchetti per ottenere solo nomi di tabelle senza estensione e per inserire i nomi delle tabelle usando evalInsert (). Un po 'strano, e altri potrebbero avere un modo più elegante per fare quello che ho fatto qui. Detto questo, è un modo per andare senza scrivere un JSL personalizzato per andare riga per riga in una tabella per effettuare la ricerca in un altro (che è anche un terzo approccio totalmente accettabile).
Ecco il codice per JMP Query Builder e ho allegato le tue tabelle di esempio per provarlo. Se sei interessato a come impostarlo interattivamente fammelo sapere: occorrono 30 secondi per crearlo da zero.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
dt1NameOnly = Left( dt1 << getname, Length( dt1 << getname ) - 4 );
dt2NameOnly = Left( dt2 << getname, Length( dt2 << getname ) - 4 );
New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( Eval Insert( "\[ [dt1<<GETNAME> "_MEMORY_", dt2<<GETNAME> "_MEMORY_"] ]\" ) ),
QueryName( "SQLQuery1" ),
Select( Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ), Column( "Group 2", "t2" ) ),
From(
Table( dt1NameOnly, Alias( "t1" ) ),
Table(
dt2NameOnly,
Alias( "t2" ),
Join(
Type( Left Outer ),
GE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "Start Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
) & LE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "End Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
)
)
)
)
) << Run;
</GETNAME></GETNAME>Ciao di nuovo, @ileshem ,
Ho accennato che è possibile risolvere questo problema con jsl personalizzato e si desidera condividere un modo per farlo con alcuni cicli For () che funzionano riga per riga nella tabella principale per trovare una data che soddisfi i criteri nella tabella secondaria. Ci sono modi per farlo in modo più efficiente per applicazioni molto grandi, ma questo è un inizio.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
For( i = 1, i <= N Row( dt1 ), i++,
For( j = 1, j <= N Row( dt2 ), j++,
If( And( dt1:date[i] >= dt2:Start Date[j], dt1:date[i] <= dt2:End Date[j] ),
dt1:Group[i] = dt2:Group[j];
Break();
)
)
);
@julian