特定事件之间的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'


以上是特定事件之间的SQL滞后的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>