Agrégation de données horaires SQL dans postgresql

9

Je suis un débutant avec une base de données, donc je cherche votre aide avec celle-ci.

J'ai un tableau contenant des données de séries chronologiques.

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

Le tableau stocke des données basées sur des intervalles en ne gardant que la limite supérieure de l'intervalle. Par exemple, la première ligne représente un intervalle de [00:00 - 00:10] avec une valeur de 10, la deuxième ligne représente un intervalle de (00:10 - 00:30] avec une valeur de 5 et la troisième représente un intervalle de (00:30 - 01:00) avec une valeur de 10.

J'ai besoin d'une requête efficace dans Postgres pour agréger des données horaires pour une structure comme celle décrite ci-dessus. Le résultat serait donc quelque chose comme ceci:

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

Notez que les données de séries chronologiques sont grandes, donc toute aide à l'indexation serait très appréciée.

Merci, dan

dan
la source
1
Dans vos exemples de données, par exemple 2012/01/01 00:10, 10, toutes ces valeurs sont-elles dans une seule colonne, ou la virgule est-elle un délimiteur de colonne? En outre, les heures exactes (1h00, 2h00, 3h00, etc.) sont-elles garanties d'être stockées dans le tableau des séries chronologiques, ou peut-il ignorer le: 00 et avoir des entrées telles que 2012/01/01 03:50suivies de 2012/01/01 04:10?
dartonw
Et si vous avez une heure sans données source? Voulez-vous toujours une sortie comme 2012/01/01 04:00, 2012/01/01 05:00, 0? ou cette heure devrait-elle simplement être omise du résumé?
Joshua Huber
@dartonw - la virgule est un délimiteur de colonne. Ainsi, l'heure et la valeur sont des colonnes différentes dans une table. Les heures exactes sont garanties d'être toujours stockées.
dan

Réponses:

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

voir sqlfiddle

Quant à l'index: vous pouvez essayer un index de fonction date_trunc('hour', t - interval '1 minute')mais je ne suis pas sûr que postgresql puisse l'utiliser.

Leo
la source
Merci, mon patron est content. Mais si vous avez besoin réel scientifique précis approche, s'il vous plaît, l' étude au travail avec des fonctions de fenêtre. PostgreSQL les prend en charge nativement: no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
Brian Haak
voté! comment feriez-vous si c'était 30 minutes au lieu d'une heure
PirateApp