Zeitreihen und Zeitstempel

Hallo,

  1. ist es möglich die Abtastrate einer Zeitreihe mit einer Abfrage zu verringern? So dass ich zum Beispiel von einer Zeitreihe mit Minutenabtastung nur genau zu jeder Stunde einen Wert in meine Antwort hineinnehme? Meine Tabelle besteht nur aus “Zeitstempel | Wert”.

  2. Ist es möglich meine Messwerte nach Zeitabschnitten zu gruppieren und zu aggregieren, also zum Beispiel das Min, Max, Avg jeden Tages oder jeder Stunde auszugeben, vielleicht noch mit Intervall angabe?

vielen Dank! :slight_smile:

Du kannst mit generate_series() Dir beliebige Zeitreihen definieren und dagegen joinen, und du kannst mit extract() oder date_part() etc. aggregieren.

Vielen Dank,

hab gerade mit extract rumgespielt, aber es noch nicht zum laufen bekommen. Kannst du mir vielleicht ein minibeispiel geben? :slight_smile:

Extract war auch keine gute idee.

test=# select now();
              now
-------------------------------
 2013-08-19 16:07:45.237125+02
(1 row)

test=*# select to_char(now(),'yyyy-mm-dd');
  to_char
------------
 2013-08-19
(1 row)

test=*# select to_char(now(),'yyyy-mm-dd hh24');
    to_char
---------------
 2013-08-19 16
(1 row)

test=*# select to_char(now(),'yyyy-mm-dd hh24:mi');
     to_char
------------------
 2013-08-19 16:07
(1 row)

Nochmals danke, aber ich wollte doch nicht aus der Aktuellen Zeit das Datum extrahieren, sondern mir von einem Tag zum Beispiel 24 Werte zu jeder Stunde mit Zeitangabe ausgeben lassen!?

Habe folgendes Beispiel gefunden:

SELECT DISTINCT ON (sample_time::date) sample_time, value
FROM timeline
ORDER BY sample_time::date DESC, sample_time DESC;

Das macht genau was ich will für jeden Tag, allerdings kann ich es nciht auf Stunden oder andere Zeitabstände runterbrechen… :frowning:



test=*# select * from captn ;
ts | val
---------------------±----
2013-08-19 10:00:00 | 15
2013-08-19 10:15:00 | 25
2013-08-19 11:00:00 | 15
(3 rows)

Time: 0,151 ms
test=*# select to_char (ts, ‘yyyy-mm-dd hh24’), avg(val) from captn group by 1 order by 1;
to_char | avg
---------------±--------------------
2013-08-19 10 | 20.0000000000000000
2013-08-19 11 | 15.0000000000000000
(2 rows)

>
> Du suchst vermutlich etwas wie das, oder?

Für gleitende Mittel etc wäre ein Blick auf Window-Funktionen sinnvoll. Wenn du Werte über Stunden oder Tage aggregieren willst kannst du das beispielsweise folgendermassen tun:

select date_time::date as datum, extract(hour from date_time) as h, sum(werte) 
  from tabelle
  group by datum, h
  order by datum, h

Gruß uwe

Großartig, vielen Dank euch! Damit kann ich jetzt was anfangen. War genau was ich wollte :slight_smile: