第 1 步:
使用窗口函数lag 检查给定传感器的先前事件(由ts 排序)是否与当前行中的事件不同,并仅保留具有不同事件的行。
with sensor_events (ts, event_name, device) as (
values
(timestamp '2021-04-28 00:00:00' ,'enter', 1),
(timestamp '2021-04-28 00:01:00' ,'exit', 1),
(timestamp '2021-04-28 00:02:00' ,'enter', 1),
(timestamp '2021-04-28 00:04:00' ,'enter', 1),
(timestamp '2021-04-28 00:06:00' ,'enter', 2),
(timestamp '2021-04-28 00:08:00' ,'exit', 1),
(timestamp '2021-04-28 00:10:00' ,'enter', 2),
(timestamp '2021-04-28 00:11:00' ,'enter', 2),
(timestamp '2021-04-28 00:14:00' ,'exit', 2)
)
, distinct_events AS (
select *
, lag(event_name) over
(partition by device order by ts)
is distinct from event_name
AS is_distinct_event
from sensor_events
)
select ts, event_name, device
from distinct_events
where is_distinct_event
输出:
ts event_name device
2021-04-28T00:00:00.000Z enter 1
2021-04-28T00:01:00.000Z exit 1
2021-04-28T00:02:00.000Z enter 1
2021-04-28T00:08:00.000Z exit 1
2021-04-28T00:06:00.000Z enter 2
2021-04-28T00:14:00.000Z exit 2
第 2 步:再次使用 lag 函数计算退出和进入事件之间的时间差。
with sensor_events (ts, event_name, device) as (
values
(timestamp '2021-04-28 00:00:00' ,'enter', 1),
(timestamp '2021-04-28 00:01:00' ,'exit', 1),
(timestamp '2021-04-28 00:02:00' ,'enter', 1),
(timestamp '2021-04-28 00:04:00' ,'enter', 1),
(timestamp '2021-04-28 00:06:00' ,'enter', 2),
(timestamp '2021-04-28 00:08:00' ,'exit', 1),
(timestamp '2021-04-28 00:10:00' ,'enter', 2),
(timestamp '2021-04-28 00:11:00' ,'enter', 2),
(timestamp '2021-04-28 00:14:00' ,'exit', 2)
)
, distinct_events AS (
select *
, lag(event_name) over
(partition by device order by ts)
is distinct from event_name
AS is_distinct_event
from sensor_events
)
, occupancy AS (
select
ts - lag(ts) over w occupancy
, event_name
, lag(event_name) over w last_event_name
, device
from distinct_events
where is_distinct_event
window w as (partition by device order by ts)
)
select
occupancy, device
from occupancy
where event_name = 'exit'
and last_event_name = 'enter'
这将输出你所追求的表格。