我有一个表格,其中包含移动设备上用户工作状态的信息。每次状态更改时,都会创建一个新行,其中包含更改前的原始状态以及现在的新状态。该表如下所示:
ID Date_Time User OriginalStatus NewStatus
---------------------------------------------------------------------------
60713 2017-04-11 12:14:42 Helen Not Started Active
60714 2017-04-11 12:19:20 Monica Active Paused
60715 2017-04-11 12:20:43 Dave Active Paused
60716 2017-04-11 12:32:18 Helen Finished Archived
60717 2017-04-11 12:48:57 Monica Paused Active
60718 2017-04-11 12:52:35 Dave Paused Active
我要做的是计算每个用户在每个日期保持“暂停”状态的持续时间......他们只能从“已暂停”状态恢复为“有效状态”,这表示他们的结束'暂停'时间,所有其他行都可以忽略,从'已暂停'回到'有效'的更改不会在连续的行中。
在上面的例子中,Monica保持“暂停”29分37秒(12:19:20至12:48:57),Dave已经'暂停'31分52秒(12:20) :43到12:52:35)。
理想情况下,我希望结果类似于:
User Paused_Start_Time Paused_End_Time Paused_Duration
---------------------------------------------------------------------------
Monica 2017-04-11 12:19:20 2017-04-11 12:48:57 00:29:37
Dave 2017-04-11 12:20:43 2017-04-11 12:52:35 00:31:52
我对如何解决这个问题感到茫然,所以所有的帮助都感激不尽。我正在使用SQL Server 2012。
答案 0 :(得分:1)
我认为你只需要filterNot
:
lead()
要获得持续时间,您可以减去这些值。但是,这会将间隔作为 datetime 值返回。您可以将其转换为select user, date_time as paused_starttime, next_date_time as paused_endtime
from (select t.*,
lead(date_time) over (partition by user order by date_time) as next_date_time
from t
) t
where status = 'paused';
,但时间永远不会超过24小时。当时间超过那个时期时,我不确定你想做什么。