SQL stündliche Datenaggregation in postgresql

9

Ich bin ein Neuling mit Datenbank, also suche ich Ihre Hilfe bei dieser.

Ich habe eine Tabelle mit Zeitreihendaten.

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

In der Tabelle werden intervallbasierte Daten gespeichert, indem nur die Obergrenze des Intervalls beibehalten wird. Zum Beispiel repräsentiert die erste Zeile ein Intervall von [00:00 - 00:10] mit einem Wert von 10, die zweite Zeile repräsentiert ein Intervall von (00:10 - 00:30] mit einem Wert von 5 und die dritte repräsentiert ein Intervall von (00:30 - 01:00) mit einem Wert von 10.

Ich benötige eine effiziente Abfrage in Postgres, um stündliche Daten für eine Struktur wie die oben beschriebene zu aggregieren. Das Ergebnis wäre also ungefähr so:

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

Beachten Sie, dass die Zeitreihendaten sehr groß sind. Daher wäre jede Hilfe bei der Indizierung sehr willkommen.

Danke, dan

Dan
quelle
1
Befinden sich in Ihren Beispieldaten beispielsweise 2012/01/01 00:10, 10alle diese Werte in einer einzelnen Spalte, oder ist das Komma ein Spaltenbegrenzer? Werden die genauen Stunden (1:00, 2:00, 3:00 usw.) garantiert in der Zeitreihentabelle gespeichert, oder wird möglicherweise die: 00 übersprungen und es werden Einträge wie 2012/01/01 03:50gefolgt von 2012/01/01 04:10?
Dartonw
Was ist, wenn Sie eine Stunde ohne Quelldaten haben? Möchten Sie immer noch eine Ausgabe wie 2012/01/01 04:00, 2012/01/01 05:00, 0? oder sollte diese Stunde einfach in der Zusammenfassung weggelassen werden?
Joshua Huber
@dartonw - Das Komma ist ein Spaltenbegrenzer. Das Datum, die Uhrzeit und der Wert sind also unterschiedliche Spalten in einer Tabelle. Die genauen Stunden werden garantiert immer gespeichert.
Dan

Antworten:

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

siehe sqlfiddle

Was den Index date_trunc('hour', t - interval '1 minute')betrifft : Sie könnten einen Funktionsindex anprobieren, aber ich bin nicht sicher, ob postgresql ihn verwenden kann.

Löwe
quelle
Danke, mein Chef ist glücklich. Wenn Sie jedoch einen wirklich wissenschaftlich fundierten, präzisen Ansatz benötigen , studieren Sie bitte, um mit Fensterfunktionen zu arbeiten. PostgreSQL unterstützt sie nativ: no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
Brian Haak
upvoted! Wie würden Sie dies tun, wenn dies 30 Minuten statt 1 Stunde wäre
PirateApp