5

我在 Zabbix DB 中有每分钟加载到它的值。我需要一个查询来计算不同日期的每小时总计,例如在 2013 年 3 月 20 日以下,我会有一行 0:00 包含时间 >= 0:00 和 < 1:00 等值的总和。然后我会在凌晨 1 点到 2 点等之间再写一行。我正在使用下面的查询,但我必须不断更改时间。我正在寻找的是一个查询,它将在一天中的每个小时内为我生成 24 行。请帮忙。

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')
4

3 回答 3

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);
于 2013-03-25T12:37:20.690 回答
0

就像是:

select '2013-03-20'::date + delta * '1 hour'::interval
from generate_series(0,23) g(delta)
于 2013-03-25T12:10:55.077 回答
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
于 2013-03-25T12:43:06.307 回答