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;
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.
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 ?!
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?
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.