Вы можете присоединить таблицу к себе в отчете о разнице дат.На самом деле это postgres, работает простой минус.
Этот подзапрос найдет все записи, которые являются «начальными событиями».То есть все записи о событиях, у которых нет другой записи о событии, произошедшей в течение 30 секунд до этого:
(Select a.event_id, a.event_time from
(Select event_id, event_time from table1) a
left join
(select event_id, event_time from table1) b
on a.event_time - b.event_time < '00:00:30' and a.event_time - b.event_time > '00:00:00'
where b.event_time is null) startevent
С несколькими изменениями ... та же логика, за исключением выбора события 'end':
(Select a.event_id, a.event_time from
(Select event_id, event_time from table1) a
left join
(select event_id, event_time from table1) b
on b.event_time - a.event_time < '00:00:30' and b.event_time - a.event_time > '00:00:00'
where b.event_time is null) end_event
Теперь мы можем объединить их вместе, чтобы связать, какое начальное событие идет к какому конечному событию:
(все еще пишу ... есть несколько способов сделать это. Япри условии, что только в примере имеются линейные идентификационные номера, поэтому вы захотите объединить время начального события с временем конечного события, имеющим наименьшую положительную разницу во времени события).
Вот мой конечный результат ... своего родавложенные много вложенных элементов
select a.start_id, case when a.event_id is null then t1.event_id::varchar else 'single event' end as end_id
from
(select start_event.event_id as start_id, start_event.event_time as start_time, last_event.event_id, min(end_event.event_time - start_event.event_time) as min_interval
from
(Select a.event_id, a.event_time from
(Select event_id, event_time from table1) a
left join
(select event_id, event_time from table1) b
on a.event_time - b.event_time < '00:00:30' and a.event_time - b.event_time > '00:00:00'
where b.event_time is null) start_event
inner join
(Select a.event_id, a.event_time from
(Select event_id, event_time from table1) a
left join
(select event_id, event_time from table1) b
on b.event_time - a.event_time < '00:00:30' and b.event_time - a.event_time > '00:00:00'
where b.event_time is null) end_event
on end_event.event_time > start_event.event_time
--check for only event
left join
(Select a.event_id, a.event_time from
(Select event_id, event_time from table1) a
left join
(select event_id, event_time from table1) b
on b.event_time - a.event_time < '00:00:30' and b.event_time - a.event_time > '00:00:00'
where b.event_time is null) last_event
on start_event.event_id = last_event.event_id
group by 1,2,3) a
left join table1 t1 on t1.event_time = a.start_time + a.min_interval
Результаты в виде start_id, end_Id:
1; "4"
5; "6"
7; "одиночное событие"
8; "одиночное событие"
9; "11"
Мне пришлось использовать третье левое соединение, чтобы выбрать отдельные события как метод обнаружения событий, которые были как начальными, так и конечными событиями.Конечный результат находится в идентификаторах и может быть связан с вашей исходной таблицей, если вам нужна другая информация, чем просто идентификатор.Не знаете, как будет масштабироваться это решение, если у вас миллионы событий ... это может быть проблемой.