2013-07-01 5 views
5

Ho una semplice tabella SQLite che registra il consumo di energia per tutto il giorno. Sembra che:Come costruire una cronologia giornaliera da un insieme di righe in SQL?

rowid  amrid  timestamp value  
---------- ---------- ---------- ---------- 
1   1   1372434068 5720  
2   2   1372434075 0   
3   3   1372434075 90   
4   1   1372434078 5800  
5   2   1372434085 0   
6   3   1372434085 95 

Vorrei costruire una storia semplificata del consumo dell'ultimo giorno ottenendo il valore più vicino per ogni 10 minuti per costruire un file CSV, che sarebbe simile:

date    value 
---------------- ---------- 
2013-07-01 00:00   90 
2013-07-01 00:10   100 
2013-07-01 00:20   145   

Come per ora ho una richiesta che mi permette di ottenere il valore più vicino per un timestamp:

SELECT * 
FROM indexes 
WHERE amrid=3 
ORDER BY ABS(timestamp - strftime('%s','2013-07-01 00:20:00')) 
LIMIT 1; 

Come posso costruire una richiesta che avrebbe fatto il trucco per farlo per tutta la giornata? Grazie,

risposta

3

Lasciami definire "valore più vicino" come il primo valore dopo l'inizio di ogni intervallo di 10 minuti. Puoi generalizzare l'idea ad altre definizioni, ma penso che sia più semplice spiegare l'idea.

Convertire l'indicatore di data e ora in un valore di stringa del modulo "aaaa-mm-gg hhMM". Questa stringa ha una lunghezza di 15 caratteri. L'intervallo di 10 minuti sarebbe i primi 14 caratteri. Quindi, usando questo come chiave di aggregazione, calcola il min(id) e usalo per tornare ai dati originali.

Ecco l'idea:

select isum.* 
from indexes i join 
    (select substr(strftime('%Y-%m-%d %H%M', timestamp), 1, 14) as yyyymmddhhm, 
      min(id) as whichid 
     from indexes 
     group by substr(strftime('%Y-%m-%d %H%M', timestamp), 1, 14) 
    ) isum 
    on i.id = isum.whichid 
+0

Typo verso la fine della linea 6? Dovrebbe finire '... 1, 14)'? – nurdglaw

+0

Mille grazie, la tua idea funziona alla grande. Ecco la mia dichiarazione finale: 'select substr (strftime ('% Y-% m-% d% H:% M', timestamp, 'unixepoch'), 1, 15) || '0' come data, \t valore da indici i join (selezionare substr (strftime ('% Y% m% d% H% M', timestamp, 'unixepoch'), 1, 11) come yyyymmddhhm, min (rowid) come whichid dagli indici dove amrid = 1 e data (timestamp, 'unixepoch') = '2013-07-01' gruppo per substr (strftime ('% Y% m% d% H% M' , timestamp, 'unixepoch'), 1, 11) ) isum su i.rowid = isum.whichid; ' –

Problemi correlati