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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.