Newsgroup: it.comp.software.database
Titolo: Serie di dati ad intervalli irregolari , come "regolarizzarli" interpolandoli linearmente?

Ciao,
ho in una tabella una serie di dati  (valore,timestamp(UNIX)) che arrivano ad intervalli irregolari,
cioe magari ogni 10 secondi poi magari ogni tanto niente per 30 secondi , poi 2 a distanza di 2 secondi,
ovviamente tutti i timestamp sono univoci.
 
Vorrei ottenere una tabella con un campione ogni 10 secondi interpolando i dati
in modo lineare, avete un idea di come potrei fare in sql ?
 
L'algoritmo sarebbe piu' o meno questo:
sia N mod 10 = 0
 
prendo il campione precedente(o corrispondente) ad N  C1 a T1(timestamp sul db)  T1<=N
prendo il campione successivo ad N  C2 A T2(timestamp sul db)        T2>N
 
calcolo  (C2-C1)/(T2-T1)*(T1-N)+C1 = V  Valore del campione al tempo N calcolato.
 
 
Come potrei implementarlo con una singola query sql ? Sarebbe una innerjoin tra la tabella dei campioni e quella contente N
ma non riesco a venirne fuori.
 
 
 
Giulia
 
 
 
 
 


Dubito che quello che chiedi si possa fare con una query. Fare una vista con un campo calcolato (restituito da una procedura in PL/SQL, se usi Oracle o in qualche linguaggio equivalente, se non lo usi) dovrebbe essere abbastanza semplice.
 
C:\>iao Angelo

 Come potrei implementarlo con una singola query sql ?
 
Io per una esigenza analoga ho calcolato la media nella finestra. Ecco 
un esempio:
 
sqlite> .schema
CREATE TABLE Somevalues(value REAL, epoch INTEGER);
sqlite> SELECT * FROM Somevalues;
51.0|0
32.0|1
39.0|2
83.0|3
73.0|4
17.0|5
72.0|6
49.0|7
70.0|8
73.0|9
sqlite> SELECT strftime('%Y-%d-%mT%H:%M:%S', epoch, 'unixepoch'), 
SUM(value)/COUNT(value) FROM Somevalues GROUP BY epoch/3;
1970-01-01T00:00:02|40.6666666666667
1970-01-01T00:00:05|57.6666666666667
1970-01-01T00:00:08|63.6666666666667
1970-01-01T00:00:09|73.0
sqlite>
 
-- 
Andrea
 


 
Io ho ragionato partendo da una tabella cosi (unixtime,unixtime).
 
0|9
10|19
20|29
30|39
40|49
 
 
se la joino con la mia tabela dati troverò per ogni riga un valore o un null se non ci sono sample negli intervalli,
se trovo null cosa mettere?
 
Giulia
 
 
 
 
 

 
 
se hai 5 valori in un intervallo come scegli quale usare (vedi domanda 
precedente)?
 
il problema e' poi trovare cosa sostituire al null.
 
il valore da mettere quando trovi null e' il risultato di un calcolo 
complesso i cui parametri dipendono da tanti fattori:
- ci sono valori nei 10 secondi precedenti?
- ci sono valori nei 10 secondi successivi?
- ce n'e' solo uno o piu' di uno?
- se non ci sono valori nei 10 secondi 'contigui' quanto devi andare 
indietro/avanti per trovare un valore utilizzabile?
 
farlo in una query sql non e' possibile.
se ti appoggi a funzioni e/o stored procedures il discorso cambia ma con 
una query sql pura e semplice non e' fattibile.
 
 
-- 
Paolo opg
 
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 vuoi fare la media, vuoi fare una interpolazione oppure dipende dai casi?
 
Secondo me vuole entrambi: vuole mediare i valori in finestre di 
dimensione fissa e nelle finestre in cui mancano campioni vuole un 
valore interpolato linearmente con le finestre prossime che ne hanno.
 
 
Io terrei una tabella con i dati che arrivano, cio� la memoria storica 
dei campioni, e un'altra con i dati mediati e interpolati.
 
Si fa una elaborazione iniziale una tantum e poi l'aggiornamento quando 
arrivano nuovi dati non pesa praticamente niente dato che si � parlato 
di periodi di 10, 30 e 2 secondi. Mi sembra una soluzione migliore che 
cercare di forzare una logica imperativa in una query.
 
-- 
Andrea
 

 On 2014-05-27 06:28:08 +0000, Paolo opg said:
 > Mi sembra una soluzione migliore che cercare di forzare una logica imperativa in una query.
 
Si potrebbe anche funzionare in effetti , anche se dovrei implementare una macchina a stati in ingresso quando volevo che la cosa fosse decisa direttamente dal 
produttore (quello che fa le insert).
 
Giulia
 
 


IMHO non conviene pre calcolare medie e interpolazioni, ma farlo solo
quando l'utente richiede i valori (e falo lato client, non la to db).
A meno che i valori calcolati vengano richiesti molto spesso ma molta
gente e/o che i calcoli siano molto complicati da richiedere diverso
tempo per venire eseguiti (media e interpolazione lineare non sono
calcoli complicati).
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?