Aggregazione dei dati orari SQL in postgresql


9

Sono un principiante con database quindi sto cercando il tuo aiuto con questo.

Ho una tabella contenente i dati delle serie storiche.

2012/01/01 00:10, 10
2012/01/01 00:30, 5
2012/01/01 01:00, 10
2012/01/01 01:40, 10
2012/01/01 02:00, 20

La tabella memorizza i dati basati sull'intervallo mantenendo solo il limite superiore dell'intervallo. Ad esempio la prima riga rappresenta un intervallo da [00:00 - 00:10] con un valore di 10, la seconda riga rappresenta un intervallo da (00:10 - 00:30] con un valore di 5 e la terza rappresenta un intervallo da (00:30 - 01:00) con un valore di 10.

Ho bisogno di una query efficiente in Postgres per aggregare i dati orari per una struttura come quella sopra descritta. Quindi il risultato sarebbe qualcosa del genere:

2012/01/01 00:00, 2012/01/01 01:00, 25
2012/01/01 01:00, 2012/01/01 02:00, 30

Si noti che i dati delle serie temporali sono grandi, quindi qualsiasi aiuto con l'indicizzazione di questo sarebbe molto apprezzato.

Grazie Dan


1
Nei tuoi dati di esempio, ad esempio 2012/01/01 00:10, 10, tutti questi valori sono in una singola colonna o la virgola è un delimitatore di colonna? Inoltre, le ore esatte (1:00, 2:00, 3:00, ecc.) Sono garantite per essere memorizzate nella tabella delle serie temporali o potrebbero saltare oltre: 00 e avere voci come 2012/01/01 03:50seguite da 2012/01/01 04:10?
Dartonw,

Cosa succede se si dispone di un'ora senza dati di origine? Vuoi ancora un risultato simile 2012/01/01 04:00, 2012/01/01 05:00, 0? o quell'ora dovrebbe essere omessa dal riassunto?
Joshua Huber,

@dartonw: la virgola è un delimitatore di colonna. Quindi la data e il valore sono colonne diverse in una tabella. Le ore esatte sono garantite per essere sempre memorizzate.
dan

Risposte:


8
select
  date_trunc('hour', t - interval '1 minute') as interv_start,
  date_trunc('hour', t - interval '1 minute')  + interval '1 hours' as interv_end,
 sum(v)
  from myt 
    group by date_trunc('hour', t - interval '1 minute')
order by interv_start

vedi sqlfiddle

Per quanto riguarda l'indice: potresti provare un indice di funzione date_trunc('hour', t - interval '1 minute')ma non sono sicuro che postgresql possa usarlo.


Grazie, il mio capo è felice. Ma se hai bisogno di un vero approccio preciso basato sulla scienza , per favore, studia per lavorare con le funzioni della finestra. PostgreSQL li supporta in modo nativo: no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
Brian Haak,

upvoted! come faresti se questo fosse di 30 minuti invece di 1 ora
PirateApp il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.