Sql server 特定事件之间的SQL延迟
我正在寻找一个解决方案,从MSSQL中的一个表中获取两个特定事件之间的延迟 下面是示例数据 我希望得到的结果是获得一个会话的持续时间,该会话从睡眠状态变为活动状态,并用相同的颜色标记。 我不想包括从任何其他阶段更改为活动阶段的会话的持续时间 更新:添加具有所需输出的示例数据。我不需要考虑一个会话活动之间的持续时间,从活跃到等待,只有睡眠到活动需要被计算。 创建表TestLag id int、session\u id int、activity\u time datetime、activity\u name nvarchar10 插入测试滞后值1,1,'2021-04-11 10:10:23','active'; 在TestLag值中插入2,1、'2021-04-12 10:12:30'、'sleep'; 插入测试滞后值3,1,'2021-04-13 10:14:11','active'; 在TestLag值4,2、'2021-04-14 10:21:21'、'sleep'中插入; 插入测试滞后值5,3,'2021-04-15 10:25:18','active'; 插入测试滞后值6,2,'2021-04-16 10:25:18','active'; 在TestLag值7,2中插入'2021-04-17 10:31:23','wait'; 在TestLag值中插入8,3、'2021-04-18 10:32:10'、'sleep'; 在TestLag值9,1中插入'2021-04-19 10:35:28','wait'; 插入测试滞后值10,3,'2021-04-20 10:37:50','active'; 插入测试滞后值11,2,'2021-04-20 10:37:55','active'; 期望输出 会话\u id活动\u持续时间\u会话\u在\u睡眠\u活动之前 1 2021-04-12 10:12:30 101 2 2021-04-14 10:21:21 237 3 2021-04-18 10:32:10 340 谢谢, 彼得试试这个:Sql server 特定事件之间的SQL延迟,sql-server,Sql Server,我正在寻找一个解决方案,从MSSQL中的一个表中获取两个特定事件之间的延迟 下面是示例数据 我希望得到的结果是获得一个会话的持续时间,该会话从睡眠状态变为活动状态,并用相同的颜色标记。 我不想包括从任何其他阶段更改为活动阶段的会话的持续时间 更新:添加具有所需输出的示例数据。我不需要考虑一个会话活动之间的持续时间,从活跃到等待,只有睡眠到活动需要被计算。 创建表TestLag id int、session\u id int、activity\u time datetime、activity\u
SELECT T1.session_id,
T1.activity_time,
DATEDIFF(second, T1.activity_time, T2.activity_time) AS SleepToActiveDurationInSeconds
FROM T T1
CROSS APPLY
(
SELECT TOP 1 activity_time, activity_name
FROM T
WHERE session_id = T1.session_id AND activity_time > T1.activity_time
ORDER BY activity_time
) T2
WHERE T1.activity_name = 'sleep' AND T2.activity_name = 'active'
样本T:
id session_id activity_time activity_name
1 1 2021-04-11 10:10:23 active
2 1 2021-04-12 10:12:30 sleep
3 1 2021-04-13 10:14:11 active
4 2 2021-04-14 10:21:21 sleep
5 3 2021-04-15 10:25:18 active
6 2 2021-04-16 10:25:18 active
7 2 2021-04-17 10:31:23 wait
8 3 2021-04-18 10:32:10 sleep
9 1 2021-04-19 10:35:28 wait
10 3 2021-04-20 10:37:50 active
11 2 2021-04-20 10:37:55 active
输出:
session_id activity_time SleepToActiveDurationInSeconds
1 2021-04-12 10:12:30 86501
2 2021-04-14 10:21:21 173037
3 2021-04-18 10:32:10 173140
请尝试此选项,所有评论均包含在: 您可以使用两个滞后函数来完成此操作,一个用于获取上一个时间,另一个用于获取上一个活动 没有必要交叉连接任何东西 选择 t、 会话id, t、 上一次活动时间, datediffsecond、prev\u time、activity\u time duration\u session\u in\u sleep\u在\u active之前 从…起 选择*, LAGactivity\u time OVER PARTITION BY session\u id ORDER BY activity\u time prev\u time, 按会话划分的分区上的活动\u名称\u id顺序按活动\u时间上的名称 来自TestLag T 其中t.activity_name='active' 和t.prev_name='sleep'
最好使用LEAD函数生成输出。请让我知道我需要进一步的改进和解释
SELECT
[A].[session_id] AS [session_id]
,[A].[current_activity_time] AS [activity_time]
,DATEDIFF(MINUTE,[A].[current_activity_time], [A].[next_activity_time]) AS
[duration_session_in_sleep_before_active]
FROM
(
SELECT
[T].[session_id]
,[T].[activity_time] AS [current_activity_time]
,[T].[activity_name] AS [current_activity_name]
,LEAD([T].[activity_time]) OVER (PARTITION BY [T].[session_id] ORDER BY [T].[activity_time] ASC) AS [next_activity_time]
,LEAD(activity_name) over (PARTITION BY [T].[session_id] ORDER BY [T].[activity_time] ASC) AS [next_activity_name]
FROM [TestLag] AS [T]
) AS A
WHERE [A].[current_activity_name] ='sleep'
AND [A].[next_activity_name] = 'active'
输出:
请在问题中以文本形式提供您的样本数据和预期结果,那么为什么LAG不能满足您的要求呢?看起来您应该添加一个partitionby子句,并在其中使用CASE表达式,尽管这取决于您希望如何处理包含“wait”的行;您没有给我们任何预期的结果。谢谢您的回复,我已经添加了样本数据
SELECT
[A].[session_id] AS [session_id]
,[A].[current_activity_time] AS [activity_time]
,DATEDIFF(MINUTE,[A].[current_activity_time], [A].[next_activity_time]) AS
[duration_session_in_sleep_before_active]
FROM
(
SELECT
[T].[session_id]
,[T].[activity_time] AS [current_activity_time]
,[T].[activity_name] AS [current_activity_name]
,LEAD([T].[activity_time]) OVER (PARTITION BY [T].[session_id] ORDER BY [T].[activity_time] ASC) AS [next_activity_time]
,LEAD(activity_name) over (PARTITION BY [T].[session_id] ORDER BY [T].[activity_time] ASC) AS [next_activity_name]
FROM [TestLag] AS [T]
) AS A
WHERE [A].[current_activity_name] ='sleep'
AND [A].[next_activity_name] = 'active'