2013-03-25 10 views
5

I valori in un DB Zabbix sono caricati su di esso ogni minuto. Ho bisogno di una query che calcola i totali orari per diversi giorni, ad esempio, entro il 20 marzo 2013, avrei una riga per 0:00 contenente una somma di valori in cui il tempo> = 0:00 e < 1:00 e così via. Poi avrei un'altra riga tra 1 e 2 AM ecc. Sto usando la query qui sotto, ma devo continuare a cambiare i tempi. Quello che sto cercando è una query che genererà per me 24 righe per ogni periodo di un'ora in un giorno. Per favore aiuto.Sommari iterativi 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 passato con MSSql ho croce unito a una tabella che contiene i numeri di agire come un indice di iterazione e poi ha aggiunto tempo basato sulla quel numero. Qualcosa come questo 'seleziona adddate (hour, @date, NumbersTable.number) da NumbersTable' –

risposta

0

Qualcosa di simile:

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

Questo genera solo la serie di ore ... come fai a dare qualcosa come un timestamp in una colonna e un conteggio di valori per quell'ora in una seconda colonna? – Saichovsky

1

Hai provato raggruppare i risultati di ora in ora?

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

ERRORE: errore di sintassi vicino a "[" LINEA 1: SELECT DATEPART (HOUR, timestamp) [HOUR],^********** Errore ********** ERRORE: sintassi errore ao vicino a "[" Stato SQL: 42601 Carattere: 34 – Saichovsky

+0

Questo errore è dovuto alla funzione per estrarre la parte Ora della colonna datetime. Sfortunatamente, non conosco la funzione appropriata in Postgre (si tratta di SQLServer), ma se si conosce la funzione corretta, questa soluzione dovrebbe funzionare. Per favore fatemi sapere se restate bloccati. –

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

O con tutte le ore piene:

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

Penso che date_trunc non funzionerà con l'orologio perché l'orologio non è un oggetto timestamp ma un intero (tempo storico) – Saichovsky