Предположим, ваше определение таблицы:
create table events(
class int,
ts timestamp,
cnt int
);
Пример запроса, сделайте все пошагово:
with time_range as (
select timestamp '2020-05-20 00:00:00' as start_time, -- current_timestamp - interval '2 day'
timestamp '2020-05-22 00:00:00' as end_time -- current_timestamp
),
interested_events as (
select e.class, e.ts, e.cnt
from events e
inner join time_range tr
on (e.ts >= tr.start_time and e.ts < tr.end_time)
),
classes_having_events as (
select distinct class
from interested_events
),
periods as (
select ts as period_start, ts + interval '5 minute' as period_end
from generate_series(
(select start_time from time_range),
(select end_time from time_range) - interval '1 second',
interval '5 minute') ts
)
select
c.class,
p.period_start ts,
(select coalesce(sum(cnt), 0)
from interested_events e
where e.class = c.class
and e.ts >= p.period_start
and e.ts < p.period_end) as cnt
from classes_having_events as c
cross join periods as p
order by 2, 1;
В time_range определите временной интервал для событий ведьмы быть проанализировано.
В заинтересованных_событиях события выбираются на основе предыдущего определенного временного интервала ( диапазон_времени - время_пуска включительно, время_кончания исключено).
В * Создано 1017 * classes_having_events набор классов. Включены все классы с хотя бы одним событием в выбранном временном интервале.
В периодах созданы 5-минутные периоды.
Наконец, мы перекрестно объединяем набор классов с периодами и для каждой комбинации класса и периода вычислить количество событий.