2017-04-12 96 views
0

我有一張表,其中包含移動設備上用戶工作狀態的信息。每當他們的狀態發生變化時,就會創建一個新的行,並在更改之前創建它們的原始狀態,以及他們現在的新狀態。該表是這樣的:SQL計算包含特定值的兩行之間的時間差

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

特別針對SQL問題,最好提及您正在使用的DBMS版本。 – niksofteng

回答

1

我想你只需要lead()

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'; 

爲了讓你可以減去值的持續時間。但是,這將返回間隔作爲datetime值。您可以將其轉換爲time,但時間永遠不會超過24小時。當時間超過這個時間時,我不確定你想要做什麼。

+0

不知道這一點。謝謝。從2012年起。 – niksofteng

+0

嗨,對不起,在回覆中遲了... –

+0

嗨,對不起,在延遲迴復... LEAD()會工作,但不幸的是,往往有額外的行之間的'暫停'狀態和'活躍'狀態。我需要的是,在發生「已暫停」的情況下,下一行與「活動」相關的用戶被標識爲「paused_endtime」,這是我無法弄清楚的部分,因爲此行可能是多個或多個行進一步向下。 –

相關問題