Summe von timestamps

Hi alle miteinander,

ich versuche die Summe von timestamps zu bilden, allerdings scheint das mit SUM() ohne typecast nicht zu gehn. Ich möchte die durchschnittliche Zeitspanne von eingefügten Einträgen ermitteln und versuche dazu folgendes:

SELECT (SUM (time))/(COUNT(DISTINCT pv_id)) from history;

Ich hoffe mir kann jemand dabei behilflich sein

mfg chuqa

Was genau erwartest Du von (‘2006-12-01 10:10:00’ + ‘2006-12-24 18:30:40’)/2 als Resultat?

Ich glaube, Du willst eher aus dem min() und max() der Spalte age() bilden, um das durch die Anzahl zu teilen.


Andreas

Btw, age() brauchst Du nicht, (max()-min())/count() sollte auch schon gehen…

naja eigentlich nicht, weil es gibt mehrere Einträge mit dem gleichem Zeitstempel und es gibt mehrere Einträge mit der gleichen pv_id, aber nie gleiche pv_id und gleicher Zeitstempel. Die Tabelle ist praktisch ein logfile und ich möchte jetzt eigentlich rausfinden, in welchem Durchschnitt ein Eintrag dazukommt.

mfg chuqa

also ich glaube ich versuche es mit einer umwandlung zum unix-timestamp, damit lässt sich rechnen:

SELECT (SUM (EXTRACT(EPOCH FROM time::timestamp)))/(COUNT(DISTINCT pv_id)) as result from history;

es wird allerdings noch nicht das richtige geliefert, weil es so wie ich es formuliert habe ja auch nicht stimmen kann. ich müsste praktisch für jede pv_id die timestamps summieren und durch die anzahl des auftretens dieser pv_id teilen und schlussendlich die durchschnittszeiten aller pv_id’s durch die anzahl der pv_id’s teilen. also einen durchschnitt vom durchschnitt. sowas lässt sich wohl besser in einer funktion realisieren ?!

mfg chuqa

Du willst doch keinen Mittelwert von Zeiten wissen, sondern den durchschnittlichen Abstand zwischen 2 Ereignissen, oder?

Angenommen, Du hast Ereignisse aller 15 Minuten. Ich rechne jetzt aber mal nicht in Minuten, sondern im Dezimalsystem, also aller 0.25 Stunden. Du hast diese Zeitpunkte:

10.0
10.25
10.5
10.75
11.0

die Summe/Anzahl währe nun:
test=# select (10+10.25+10.5+10.75+11)/5;
?column?

10.5000000000000000
(1 row)

Das ist latürnich nicht das, was Du willst.

Du willst doch eher: (max(zeitpunkt)-min(zeitpunkt)) / (Anzahl -1), also sowas:
test=# select (11.0-10.0)/4;
?column?

0.25000000000000000000
(1 row)


Andreas

stimmt hast recht, das ganze müsste ich dann aber trotzdem für jede pv_id extra ausrechnen und dann aus der summe den durchschnitt bilden.

Ja. Und?

test=# select * from log;
 pvid |         ts          |    entry
------+---------------------+-------------
    1 | 2006-12-21 10:00:00 | bla 1 10:00
    1 | 2006-12-21 10:15:00 | bla 1 10:15
    1 | 2006-12-21 10:30:00 | bla 1 10:30
    1 | 2006-12-21 10:45:00 | bla 1 10:45
    1 | 2006-12-21 11:00:00 | bla 1 11:00
    2 | 2006-12-21 10:15:00 | bla 2 10:15
    2 | 2006-12-21 11:15:00 | bla 2 11:15
    3 | 2006-12-21 10:30:00 | bla 3 10:30
(8 rows)

test=# select pvid, (max(ts)-min(ts))/(count(pvid)-1) from log group by pvid having count(pvid)>1 order by pvid;
 pvid | ?column?
------+----------
    1 | 00:15:00
    2 | 01:00:00
(2 rows)

Aufpassen: falls es nur einen Eintrag für ein pvid gibt, läßt sich schlecht ein Abstand zwischen 2 Ereignissen berechnen. Daher ist das HAVING nicht ganz unwichtig.

ok, ich danke vielmals :smiley: