日付差異ステートメントでテーブルをそれ自体に結合できます。実際、これは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
いくつかの変更を加えて...「終了」イベントをピックアップすることを除いて、同じロジック:
(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
これで、これらを結合して、どの開始イベントがどの終了イベントにつながるかを関連付けることができます。
(まだ書いています...これにはいくつかの方法があります。例だけが線形ID番号を持っていると仮定しているので、開始イベント時間と終了イベント時間を結合して、正の差が最小になるようにする必要がありますイベント時間)。
これが私の最終結果です...多くのサブセレクトがネストされています
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"
開始イベントと終了イベントの両方であるイベントを検出する方法として、単一のイベントを選択するために 3 番目の左結合を使用する必要がありました。最終結果は ID にあり、ID だけでなく別の情報が必要な場合は、元のテーブルにリンクすることができます。何百万ものイベントがある場合、このソリューションがどのように拡張されるかわからない...問題になる可能性があります。