一、業務場景描述
vpn的訪問日誌有三個字段,用戶名、時間、狀態,
如 張三、‘2020-04-28 10:00:00'、’login',即張三這個用戶10點登陸了vpn
如 張三、‘2020-04-28 11:10:00'、’login',即張三這個用戶11:10退出了vpn
現在有一天的訪問vpn的日誌,如果某個用戶第一條就是logout,就默認該用戶的今天的第一次登錄爲0點,如果某個用戶的最後一條日誌狀態是login,說法默認該用戶的今天的最後一欠退出vpn的時間爲23:59,如下爲4-28當天的vpn訪問日誌記錄
'aa','2020-04-28 09:30:00','login'
'aa','2020-04-28 10:15:00','logout'
'aa','2020-04-28 13:30:00','login'
'aa','2020-04-28 14:15:00','logout'
'bb','2020-04-28 06:30:00','login'
'bb','2020-04-28 09:15:00','logout'
'bb','2020-04-28 12:30:00','login'
'cc','2020-04-28 11:25:00','logout'
'cc','2020-04-28 16:30:00','login'
'cc','2020-04-28 20:10:00','logout'
'dd','2020-04-28 05:25:00','logout'
'dd','2020-04-28 10:30:00','login'
'dd','2020-04-28 11:10:00','logout'
'dd','2020-04-28 21:15:00','login'
二、統計vpn每個小時的在線人數
先查出每個用戶的每次的登錄、退出時間並放在一條數據上
select name,
case when stat='logout' then logout_ts else login_ts end as login_ts,
case when stat='logout' then login_ts else logout_ts end as logout_ts
from
(
select name,ts as login_ts,xx as logout_ts,rn,stat from
(
select name,ts,stat,
-- 按用戶名分組,lead窗口函數取下一條的時間
case when stat='login'
then lead(ts,1,'2020-04-28 23:59:59') over(partition by name order by ts)
else '2020-04-28 00:00:00' end as xx,
ROW_NUMBER() OVER( PARTITION BY name ORDER BY ts asc) rn
from test20200428) tt where stat='login' or (stat='logout' and rn=1)
) ttt
處理的結果如下
接下來的處理可以基於上表來進行相應的處理