2017-01-25 5 views
0

Ich verwende Postgres (RDS) zum Speichern von Zeitreihendaten.Postgresql Zeitreihenintervall

Lassen Sie uns sagen, dass meine Daten wie folgt aussehen:

  • Zeitstempel: (Index und Partitionsschlüssel)
  • Quelle: Integer Index
  • Daten: Binary json enthält die Daten,
timestamp   | source | data 
---------------------+----------+------------------ 
2017-01-24 19:24:41 | 1  | { some jsonb } 
2017-01-24 19:25:41 | 1  | { some jsonb } 
2017-01-24 19:25:41 | 2  | { some jsonb } 
2017-01-24 19:26:41 | 3  | { some jsonb } 
2017-01-24 19:32:41 | 1  | { some jsonb } 
2017-01-24 19:33:41 | 2  | { some jsonb } 
2017-01-24 19:45:41 | 3  | { some jsonb } 
2017-01-24 19:50:41 | 1  | { some jsonb } 
2017-01-24 19:56:41 | 1  | { some jsonb } 
2017-01-24 20:01:41 | 1  | { some jsonb } 

Ich möchte um die Daten nach source zu sortieren und die Daten nach Intervall zu teilen, sagen wir mal geteilt durch ein 15-Minuten-Intervall. Ich möchte auch round die Zeit, wenn es auf Intervall aufgeteilt wird.

Bisher habe ich

SELECT date_trunc('hour', timestamp) + date_part('minute', timestamp)::int/15 * interval '15 min' AS fifteen_minutes, data 
FROM MY_TABLE 
where source=1 
GROUP BY data, fifteen_minutes 
ORDER BY fifteen_minutes desc 

Welche kehrt

fifteen_minutes  | source | data 
---------------------+----------+------------------ 
2017-01-24 19:15:00 | 1  | { some jsonb } 
2017-01-24 19:15:00 | 1  | { some jsonb } 
2017-01-24 19:30:00 | 1  | { some jsonb } 
2017-01-24 19:45:00 | 1  | { some jsonb } 
2017-01-24 19:45:00 | 1  | { some jsonb } 
2017-01-24 20:00:00 | 1  | { some jsonb } 

Das Problem ist, dass ich immer noch mehrere Ergebnisse für jedes Intervall zu bekommen. Ich möchte durch das Intervall zu distinct und erhalten den nächsten Zeitstempel

Idealerweise würde ich bekommen: (Einzel Ergebnis pro Intervall)

fifteen_minutes  | source | data 
---------------------+----------+------------------ 
2017-01-24 19:15:00 | 1  | { some jsonb } 
2017-01-24 19:30:00 | 1  | { some jsonb } 
2017-01-24 19:45:00 | 1  | { some jsonb } 
2017-01-24 20:00:00 | 1  | { some jsonb } 

Jede bessere Idee? Danke!

+1

Bitte senden Sie das erwartete Ausgabe auf der Grundlage der obigen Daten – GurV

+2

Für eine Quelle und jeder 15-minütigen Eimer, wie werden Sie welcher Wert von „Daten“ entscheiden zu benutzen? –

+0

der "nächste" Wert für ex ' von '2017-01-24 19: 24: 41' oder' 2017-01-24 19: 25: 41' => '19: 24: 41' ist am nächsten an 19: 15. Zur Zeit bearbeitet der Code diese Logik durch eine Karte, die die Ergebnisse reduziert –

Antwort

1
select distinct on (fifteen_minutes, source) 
    fifteen_minutes, source, data 
from (
    select 
     to_timestamp((extract(epoch from timestamp)/(15 * 60))::int * 15 * 60) as fifteen_minutes, 
     data, timestamp 
    from t 
) t 
order by 
    fifteen_minutes, source, 
    abs(extract(epoch from timestamp) - extract(epoch from fifteen_minutes)) 
+0

Danke !!!! Clodoaldo Neto !!! –