2013-03-25 5 views
5

У меня есть значения в DB Zabbix, которые загружаются на нее каждую минуту. Мне нужен запрос, который вычисляет почасовые итоги за разные дни, например, до 20 марта 2013 года. У меня будет строка для 0:00, содержащая сумму значений, где время> = 0:00 и < 1:00 и т. Д. Тогда у меня будет другая строка между 1 и 2 утра и т. Д. Я использую следующий запрос, но мне нужно постоянно менять время. Я ищу запрос, который будет генерировать для меня 24 строки для каждого часа в день. Пожалуйста помоги.Итеративные суммы в 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

В прошлом с MSSQL я крест присоединился к таблице, содержащей номера, чтобы действовать в качестве индекса итерации, а затем добавлено время на основе это число. Что-то вроде этого 'select adddate (hour, @date, NumbersTable.number) из NumbersTable' –

ответ

0

Что-то вроде:

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

Это только генерирует серию часов ... как вы его получите, чтобы дать soemthing, как временная метка в одном столбце, и количество значений для этот час во второй колонке? – Saichovsky

1

Вы пробовали группировать результаты по часам?

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

ОШИБКА: синтаксическая ошибка в точке или рядом "[" LINE 1: SELECT DATEPART (HOUR, timestamp) [HOUR],^********** Ошибка ********** ОШИБКА: синтаксис ошибка в или рядом "[" Состояние SQL: 42601 Символ: 34 – Saichovsky

+0

Эта ошибка связана с функцией для извлечения части часа столбца datetime. К сожалению, я не знаю соответствующей функции в postgre (это от SQLServer), но если вы знаете правильную функцию, это решение должно работать. Пожалуйста, дайте мне знать, если вы застряли. –

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

Или все часы заполнены:

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

Я думаю, что date_trunc не будет работать с часами, потому что часы - это не объект временной метки, а целое (время эпохи) – Saichovsky

Смежные вопросы