特定事件之间的SQL滞后
我正在寻找一种解决方案,以从 MSSQL 中的表中获取两个特定事件之间的滞后。
示例数据如下。
我希望获得的结果是获得从睡眠中变为活动的会话的持续时间(以相同颜色标记)。我不想包括其阶段从任何其他阶段更改为活动的会话的持续时间。
更新:添加了具有所需输出的示例数据。我不需要考虑从等待到活动的会话活动之间的持续时间,只需要计算睡眠到活动的时间。
create table TestLag (id int, session_id int, activity_time datetime, activity_name nvarchar(10))
INSERT into TestLag Values (1,1,'2021-04-11 10:10:23','active');
INSERT into TestLag Values (2,1,'2021-04-12 10:12:30','sleep');
INSERT into TestLag Values (3,1,'2021-04-13 10:14:11','active');
INSERT into TestLag Values (4,2,'2021-04-14 10:21:21','sleep');
INSERT into TestLag Values (5,3,'2021-04-15 10:25:18','active');
INSERT into TestLag Values (6,2,'2021-04-16 10:25:18','active');
INSERT into TestLag Values (7,2,'2021-04-17 10:31:23','wait');
INSERT into TestLag Values (8,3,'2021-04-18 10:32:10','sleep');
INSERT into TestLag Values (9,1,'2021-04-19 10:35:28','wait');
INSERT into TestLag Values (10,3,'2021-04-20 10:37:50','active');
INSERT into TestLag Values (11,2,'2021-04-20 10:37:55','active');
Desired output
session_id activity_time duration_session_in_sleep_before_active
1 2021-04-12 10:12:30 101
2 2021-04-14 10:21:21 237
3 2021-04-18 10:32:10 340
谢谢,
彼得
回答
您可以使用两个LAG函数执行此操作,一个用于获取上一次,另一个用于获取上一次活动
无需交叉连接任何东西
SELECT
t.session_id,
t.prev_time activity_time,
datediff(second, prev_time, activity_time) duration_session_in_sleep_before_active
FROM (
SELECT *,
LAG(activity_time) OVER (PARTITION BY session_id ORDER BY activity_time) prev_time,
LAG(activity_name) OVER (PARTITION BY session_id ORDER BY activity_time) prev_name
FROM TestLag
) t
WHERE t.activity_name = 'active'
AND t.prev_name = 'sleep'