drop table HB_TBL;
create table HB_TBL(
ID VARCHAR(256),
DEVICE_ID VARCHAR(256),
FLAG INT COMMENT '1:ONLINE, 0:OFFLINE',
EVENT_TIME DATETIME,
primary KEY(ID)
)
;
delete from HB_TBL;
delete from HB_EVENT_SINK_TBL;
insert into HB_TBL
VALUES
('1','D001',1,'2024-03-31 00:01:00'),
('2','D001',1,'2024-03-31 00:02:00'),
('3','D001',0,'2024-03-31 00:03:00'),
('4','D001',0,'2024-03-31 00:04:00'),
('5','D001',1,'2024-03-31 00:05:00'), -- 1) resume
('6','D001',1,'2024-03-31 00:06:00'),
('7','D001',0,'2024-03-31 00:07:00'),
('8','D001',1,'2024-03-31 00:08:00'), -- 1) resume
('9','D001',1,'2024-03-31 00:09:00'), -- 1) resume
('10','D001',0,'2024-03-31 00:10:00') -- 1) resume
;
select * from HB_TBL;
ID
DEVICE_ID
FLAG
EVENT_TIME
1
D001
1
2024-03-31 00:01:00
2
D001
1
2024-03-31 00:02:00
3
D001
0
2024-03-31 00:03:00
4
D001
0
2024-03-31 00:04:00
5
D001
1
2024-03-31 00:05:00
6
D001
1
2024-03-31 00:06:00
7
D001
0
2024-03-31 00:07:00
8
D001
1
2024-03-31 00:08:00
信号事件表,写入发现offline后再次online的事件:
drop table HB_EVENT_SINK_TBL;
create table HB_EVENT_SINK_TBL(
EVENT_ID VARCHAR(256),
DEVICE_ID VARCHAR(256),
STOP_TIME DATETIME,
RESUME_TIME DATETIME,
primary KEY(EVENT_ID)
)
;
insert into HB_EVENT_SINK_TBL(EVENT_ID,
DEVICE_ID,
STOP_TIME,
RESUME_TIME)
with HB_VW AS(
select
ID ,
DEVICE_ID ,
FLAG ,
cast(EVENT_TIME as DATETIME) EVENT_TIME,
LAG(FLAG) over(partition by DEVICE_ID order by EVENT_TIME) NEXT_FLAG ,
LAG(EVENT_TIME) over(partition by DEVICE_ID order by EVENT_TIME) NEXT_EVENT_TIME
from
HB_TBL
order by EVENT_TIME
)
select concat(x.DEVICE_ID,'|',uuid()) EVENT_ID, x.DEVICE_ID, x.NEXT_EVENT_TIME, x.EVENT_TIME
from HB_VW x
where x.FLAG = 1 and x.NEXT_FLAG = 0
;
EVENT_ID
DEVICE_ID
STOP_TIME
RESUME_TIME
D001|f8aa7800-ef46-11ee-9fa3-70a6ccc6a40c
D001
2024-03-31 00:04:00
2024-03-31 00:05:00
D001|f8aa9482-ef46-11ee-9fa3-70a6ccc6a40c
D001
2024-03-31 00:07:00
2024-03-31 00:08:00
进一步可以分析出,offline信号的持续时长:
with HB_VW AS(
select
ID ,
DEVICE_ID ,
FLAG ,
cast(EVENT_TIME as DATETIME) EVENT_TIME,
LAG(FLAG) over(partition by DEVICE_ID order by EVENT_TIME) NEXT_FLAG ,
LAG(EVENT_TIME) over(partition by DEVICE_ID order by EVENT_TIME) NEXT_EVENT_TIME
from
HB_TBL
)
, EVENT_VW01 as (
select
concat(x.DEVICE_ID,'|', uuid()) EVENT_ID,
x.DEVICE_ID,
x.NEXT_EVENT_TIME last_stop_time,
x.EVENT_TIME,
(select max(event_time) from HB_VW v where v.event_time<x.EVENT_TIME and flag=1) previous_resume_event_time
from HB_VW x
where
x.FLAG = 1 and x.NEXT_FLAG = 0
)
select x.*
, (select min(event_time) from HB_VW v where v.event_time>x.previous_resume_event_time and flag=0) first_stop_time
, (select count(1) from HB_VW v where v.event_time>ifnull(x.previous_resume_event_time,'20200101') and v.event_time < x.EVENT_TIME and flag=0) stop_hb_cnt
from EVENT_VW01 x
;