Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 特定事件之间的SQL延迟_Sql Server - Fatal编程技术网

Sql server 特定事件之间的SQL延迟

Sql server 特定事件之间的SQL延迟,sql-server,Sql Server,我正在寻找一个解决方案,从MSSQL中的一个表中获取两个特定事件之间的延迟 下面是示例数据 我希望得到的结果是获得一个会话的持续时间,该会话从睡眠状态变为活动状态,并用相同的颜色标记。 我不想包括从任何其他阶段更改为活动阶段的会话的持续时间 更新:添加具有所需输出的示例数据。我不需要考虑一个会话活动之间的持续时间,从活跃到等待,只有睡眠到活动需要被计算。 创建表TestLag id int、session\u id int、activity\u time datetime、activity\u

我正在寻找一个解决方案,从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 谢谢,

彼得

试试这个:

  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'