Thinking out of the box here, why do you not maintain the summary table with a trigger?
here is an example for your case (omitted FKs etc.)
create table event_type (
event_type_id serial,
event_name varchar(255)
);
create table event (
event_time timestamp(0),
event_type_id int
);
create table event_summary (
event_summary_id serial,
sum_from timestamp(0),
sum_to timestamp(0),
event_type_id int
);
create language plpgsql;
create or replace function event_insertion() returns trigger as $$
declare
var_event_summary_id integer;
begin
-- find out if event was fired during the previous second
select
event_summary_id
into
var_event_summary_id
from
event_summary s
where
new.event_type_id = s.event_type_id
and sum_to >= new.event_time - interval '1 seconds';
if found then
--update existing summary to include this timestamp
update event_summary set sum_to = new.event_time where event_summary_id = var_event_summary_id;
else
--create new summary for just this timestamp
insert into event_summary(sum_from,sum_to,event_type_id) values (new.event_time,new.event_time,new.event_type_id);
end if;
return null;
end;
$$ language plpgsql;
create trigger event_insertion after insert on event
for each row execute procedure event_insertion();
-- some initial data
insert into event_type(event_name) values ('a');
insert into event_type(event_name) values ('b');
insert into event_type(event_name) values ('c');
insert into event_type(event_name) values ('0');
-- fire the events
insert into event(event_time,event_type_id) values (now(),(select event_type_id from event_type where event_name = 'a'));
select pg_sleep(1);
insert into event(event_time,event_type_id) values (now(),(select event_type_id from event_type where event_name = 'a'));
insert into event(event_time,event_type_id) values (now(),(select event_type_id from event_type where event_name = 'b'));
select pg_sleep(1);
insert into event(event_time,event_type_id) values (now(),(select event_type_id from event_type where event_name = 'b'));
select pg_sleep(7);
insert into event(event_time,event_type_id) values (now(),(select event_type_id from event_type where event_name = 'a'));
select pg_sleep(1);
insert into event(event_time,event_type_id) values (now(),(select event_type_id from event_type where event_name = 'a'));
insert into event(event_time,event_type_id) values (now(),(select event_type_id from event_type where event_name = '0'));
insert into event(event_time,event_type_id) values (now(),(select event_type_id from event_type where event_name = 'c'));
select pg_sleep(1);
insert into event(event_time,event_type_id) values (now(),(select event_type_id from event_type where event_name = 'a'));
-- query the summary table
select extract (seconds from s.sum_from), extract (seconds from s.sum_to), t.event_name from event_summary s inner join event_type t on (t.event_type_id = s.event_type_id);