2013-03-25 9 views
5

Ich habe Werte in einer Zabbix DB, die jede Minute geladen werden. Ich brauche eine Abfrage, die stündliche Summen für verschiedene Tage berechnet, z. B. unter 20. März 2013, würde ich eine Zeile für 0:00 haben, die eine Summe von Werten enthält, wobei Zeit> = 0:00 und < 1:00 und so weiter. Dann hätte ich noch eine Zeile zwischen 1 und 2 Uhr usw. Ich benutze die Abfrage unten, aber ich muss die Zeiten ändern. Nach was ich suche, ist eine Abfrage, die für mich 24 Reihen für jede Stundenperiode an einem Tag erzeugen wird. Bitte helfen Sie.Iterative Summierungen in SQL

SELECT 
    SUM(CASE WHEN itemid = 23661 
     THEN value ELSE 0 END) Hits 
    FROM history_uint WHERE 
     clock >= EXTRACT(EPOCH FROM TIMESTAMP '2013-03-24 00:00:00') 
     AND clock < EXTRACT(EPOCH FROM TIMESTAMP '2013-03-24 01:00:00') 
+0

In der Vergangenheit mit MSSql Ich habe Kreuz zu einem Tisch verbunden Zahlen enthält als Iteration Index zu handeln und dann die Nachspielzeit, basierend auf diese Nummer. So etwas wie 'Wähle Adddate (Stunde, @Datum, NumbersTable.Number) aus NumbersTable' –

Antwort

0

Etwas wie:

select '2013-03-20'::date + delta * '1 hour'::interval 
from generate_series(0,23) g(delta) 
+0

Dies erzeugt nur die Reihe von Stunden ... wie bekommt man es so etwas wie einen Zeitstempel in einer Spalte und eine Anzahl von Werten für diese Stunde in einer zweiten Spalte? – Saichovsky

1

Haben Sie versucht, die Ergebnisse von Stunde zu Stunde Gruppierung?

SELECT DATEPART(HOUR, timestamp) [HOUR] 
, SUM(CASE WHEN itemid = 23661 THEN value ELSE 0 END) hits 
FROM history_uint 
WHERE clock >= EXTRACT(EPOCH FROM timestamp '2013-03-24') 
    AND clock < EXTRACT(EPOCH FROM timestamp '2013-03-25') 
GROUP BY DATEPART(HOUR, timestamp); 
+0

FEHLER: Syntaxfehler bei oder in der Nähe von "[" LINE 1: SELECT DATEPART (HOUR, Zeitstempel) [HOUR],^********** Fehler ********** FEHLER: Syntax Fehler bei oder nahe "[" SQL-Status: 42601 Zeichen: 34 – Saichovsky

+0

Dieser Fehler liegt an der Funktion, den Hour-Teil der Datetime-Spalte zu extrahieren. Leider kenne ich nicht die entsprechende Funktion in postgre (das ist von SQLServer), aber wenn Sie die richtige Funktion kennen, sollte diese Lösung funktionieren. Bitte lassen Sie mich wissen, wenn Sie nicht weiterkommen. –

0
select 
    date_trunc('hour', clock) "hour", 
    sum((itemid = 23661)::integer) hits 
from history_uint 
group by 1 
order by 1 

Oder mit allen Stunden gefüllt:

select 
    s.hour, count(itemid = 23661 or null) hits 
from 
    (
     select date_trunc('hour', clock) "hour", itemid 
     from history_uint 
    ) h 
    right join (
     select date_trunc('hour', d) "hour" 
     from generate_series (
      (select min(clock::date)), 
      (select max(clock)::date + 1) - interval '1 hour', 
      '1 hour' 
     ) s(d) 
    ) s on s.hour = h.hour 
group by 1 
order by 1 
+1

Ich denke, date_trunc funktioniert nicht mit Clock, weil Clock kein Timestamp-Objekt ist, sondern Integer (Epoche) – Saichovsky