Ciao Kennedy3,
Se stai cercando un modo per farlo manualmente, il seguente approccio (che può essere facilmente creato tramite script) dovrebbe funzionare per te. La formula seguente copia il valore di "Cambia livello" nella nuova colonna della formula finché non incontra un timestamp con un nuovo "Cambia livello".
Presupposti: la Tabella 1 e la Tabella 2 hanno gli stessi nomi di colonna per Data;
Nei passaggi seguenti, la Tabella 1 ha una colonna denominata "Cambia livello"
Passaggio 1: utilizzare Tabelle => Concatena per aggiungere una tabella all'altra
Passaggio 2: utilizzare Tabelle => Ordina per ordinare la nuova tabella per data
Passaggio 3: crea una colonna Formula nella tabella risultante con la seguente formula:
(Nella formula sopra, la nuova colonna della formula si chiama "Colonna 3")
Se non vuoi mantenere le informazioni della Tabella 1 nella tabella risultante (cioè se è solo una tabella di "ricerca"), puoi selezionare tutte le righe non mancanti dalla colonna "Cambia livello" ed eliminarle.
Spero che questo ti aiuti…
Ho affrontato un problema simile nel monitoraggio di vari sensori nella mia casa. Ho 5 sensori in tutta la casa, che misurano temperatura, umidità e illuminazione. Inviano misurazioni a un hub centrale (SmartThings) ogni 8 minuti a meno che il valore non sia cambiato rispetto al valore precedente. Ho anche un misuratore di potenza continuo, che misura l'utilizzo di energia in casa.
Il modo in cui ho affrontato questo problema è stato creare una tabella dati JMP "anno di 5 minuti", che contiene campioni ogni 5 minuti per un anno. E poi inserisco i valori dei miei 20 sensori in questa tabella di 5 minuti dell'anno utilizzando uno script. Quindi, se ho una lettura su quel particolare campione per un sensore, viene registrata, altrimenti c'è un valore mancante.
Anno di 5 minuti:

Ho un altro script che mi consente di visualizzare la "salute del sensore" - fondamentalmente un controllo "IsMissing". Questo mi fa sapere quando ho problemi di rete, problemi con i sensori, ecc. È stato molto utile. E visualizza anche se la mia unione funziona.

Quindi, fondamentalmente, la strategia era quella di utilizzare una tabella di campionamento principale all'intervallo di tempo più breve che avrei avuto nelle mie misurazioni (ogni minuto) e unire ciascun sensore a quella tabella principale.
Penso che questo sia un "interlacciamento" piuttosto che un "unione", e sicuramente c'è più di un risultato che potrebbe essere desiderabile.
Ho tirato fuori del vecchio codice che penso sia vicino a quello che vuoi. Inoltre, anche nel mondo di JSL ci saranno modi buoni e meno buoni per arrivare dove vuoi essere. Quindi, come alternativa all'approccio di Eric, vedi sotto. Sono sicuro che potrebbe essere reso più efficiente e potrebbe essere qualcosa su cui altri potrebbero voler provare. . .
NomiDefaultToHere ( 1 ) ;
// Crea alcuni dati di "data" in due tabelle
nf = 100 ;
vals = J ( nf , 1 , Intero casuale ( DataDMY ( 1 , 1 , 2014 ) , DataDMY ( 31 , 12 , 2014 ))) ;
dtFine = Nuova tabella ( "Data e ora nel 2014 - Bene" ,
Nuova colonna ( "Data" , Numerico , Continuo ,
Formato ( "ddMonyyyy h:m:s" , 22 , 0 ) ,
Formato di input ( "ddMonyyyy h:m:s" , 0 ) ,
Valori ( vals )
)
) ;
nc = 10 ;
vals = J ( nc , 1 , Intero casuale ( DataDMY ( 1 , 1 , 2014 ) , DataDMY ( 31 , 12 , 2014 ))) ;
dtCoarse = Nuova tabella ( "Data e ora nel 2014 - Grossolana" ,
Nuova colonna ( "Data" , Numerico , Continuo ,
Formato ( "ddMonyyyy h:m:s" , 22 , 0 ) ,
Formato di input ( "ddMonyyyy h:m:s" , 0 ) ,
Valori ( vals )
) ,
Nuova colonna ( "Temperatura" , Numerico , Continuo , Formula ( CasualeNormale ( 18 , 2 )))
) ;
dtFine << Ordinare ( Di ( : Data ) , Ordine ( Ascendente ) , Sostituisci tabella ) ;
dtCoarse << Ordinare ( Di ( : Data ) , Ordine ( Ascendente ) , Sostituisci tabella ) ;
// ************************************************ ************************************************** ****
// Interlaccia i dati grossolani con i dati fini
// ************************************************ ************************************************** ****
// Aggiunge le colonne da dtCoarse a dtFine
Aspettare ( 3 ) ;
N = NCol ( dtFine ) ;
col = dtCoarse << getColumnNames ( "Corda" ) ;
Per ( C = 1 , C <= Articoli ( col ) , C ++,
dtype = Colonna ( dtCoarse , col [ C ]) << getDataType ;
mtype = Colonna ( dtCoarse , col [ C ]) << getModelingType ;
aggiungiCol = Espr ( dtFine << Nuova colonna ( col [ C ] , dtype , mtype , formatoTBD )) ;
SostituisciInto ( aggiungiCol , Espr ( formatoTBD ) , Colonna ( dtCoarse , col [ C ]) << getFormat ) ;
aggiungiCol ;
) ;
// ************************************************ ************************************************** ****
// La logica si basa sul fatto che le due tabelle siano ordinate in ordine crescente!
// ************************************************ ************************************************** ****
beneDT = Colonna ( dtFine , "Data" ) << getValues ;
grossolanoDT = Colonna ( dtCoarse , "Data" ) << getValues ;
Se (
// Nessun orario in dtCoarse è successivo al primo orario in dtFine, quindi inserisci i valori nella prima riga di quest'ultima
Massimo ( grossolanoDT ) < minimo ( beneDT ) ,
Per ( C = 1 , C <= Articoli ( col ) , C ++,
Colonna ( dtFine , N + C )[ 1 ] = Colonna ( dtCoarse , col [ C ])[ NRow ( dtCoarse )] ;
) ,
// Altro . . .
// pos conterrà le posizioni delle righe in dtFine in cui devono essere inseriti i valori in dtCoarse.
// (Nota: se un valore in pos è maggiore di NRow(dtFine), non verrà aggiunta alcuna riga a quest'ultimo e non verrà generato alcun errore).
pos = LocOrdinato ( beneDT , grossolanoDT ) ;
pos = pos + J ( NRow ( pos ) , 1 , 1 ) ;
// Inserisce valori nelle celle
Per ( P = 1 , P <= NRow ( pos ) , P ++,
Per ( C = 1 , C <= Articoli ( col ) , C ++,
Colonna ( dtFine , N + C )[ pos [ P ]] = Colonna ( dtCoarse , col [ C ])[ P ] ;
) ;
) ;
) ;
Ehi, Kennedy3,
Penso che questo sia un problema comune a causa dei sensori che registrano solo i cambiamenti nei livelli invece di registrare i livelli anche se invariati a intervalli fissi, quindi ho deciso di pensarci un po'.L'unico modo in cui so come farlo è con una query composta che potrebbe essere proibitivamente inefficiente per tabelle di grandi dimensioni, o forse potresti trovare una variazione che potrebbe essere più efficiente.
Ecco un esempio: diciamo che gestisco un country club e sto osservando la relazione tra il numero di golfisti e la temperatura.Tutto quello che ho per i dati sulla temperatura è una tabella della temperatura media settimanale:

Per quanto riguarda il numero di golfisti, ho una studentessa estiva che lavora per me in giorni casuali e le ho fatto contare i golfisti.Ecco i suoi dati:

Si noti che le date in cui ha contato i golfisti non corrispondono alle date delle letture medie delle alte temperature.Quello che vorrei fare per ogni data in cui ha contato i golfisti è trovare la lettura della temperatura per l'inizio di quella settimana.Se unisco le due tabelle con la condizione "Week <= TestDate", utilizzando questo SQL:
SELECT t2.TestDate, t1.Week
FROM dbo.Golfers t2
LEFT OUTER JOIN dbo.AvgHighTemps t1
ON ( t1.Week <= t2.TestDate )
ORDER BY t2.TestDate ASC;
Otterrò una tabella simile a questa:

Tieni presente che ogni TestDate ora ha più settimane corrispondenti.Ma se estraggo la riga con la data della settimana più grande inferiore a TestDate, quella sarà la settimana che desidero.Posso farlo con questo SQL:
SELECT t2.TestDate, MAX(t1.Week) AS Week
FROM dbo.AvgHighTemps t1
FULL OUTER JOIN dbo.Golfers t2
ON ( t2.TestDate >= t1.Week )
GROUP BY t2.TestDate
ORDER BY t2.TestDate ASC;
e la tabella risultante è simile alla seguente:

Ora viene la parte difficile.Devo utilizzare quella query come sottoquery, unendo ad essa le altre due tabelle, per ottenere il risultato desiderato.Ecco l'SQL:
SELECT t1.Week, t1.AvgHighTemp, t2.TestDate, t2.NGolfers
FROM (
SELECT t1.TestDate, MAX(t2.Week) as TempWeek
FROM dbo.Golfers t1
LEFT OUTER JOIN dbo.AvgHighTemps t2
ON ( t2.Week <= t1.TestDate )
GROUP BY t1.TestDate
) tempFinder
RIGHT OUTER JOIN dbo.AvgHighTemps t1
ON t1.Week = tempFinder.TempWeek
RIGHT OUTER JOIN dbo.Golfers t2
ON t2.TestDate = tempFinder.TestDate
;
Il risultato è una tabella che riporta il numero di golfisti e la temperatura media per la settimana corrispondente:

È un po' di lavoro per arrivarci, ma personalmente non conosco un altro modo per farlo.
Spero che questo ti aiuti,
Eric