2014-10-17 66 views
0

問題出在這裏。我有一個表格,其中有不同的進程和狀態以及狀態時間戳。例如。 ID 135的處理在此時的狀態1爲「2014-01-09 15:41:22」。 有4種狀態類型0 =正常1 =警告2 =嚴重3 =未知。下面是表的一個片段:在表中查找間隔

id state_time   process_id state 
37 "2014-01-09 15:41:22" 135  1 
92 "2014-01-09 15:42:01" 135  0 
153 "2014-01-09 15:46:28" 135  1 
204 "2014-01-09 15:47:25" 135  0 
259 "2014-02-05 14:48:00" 135  1 
321 "2014-02-05 14:49:20" 135  2 
352 "2014-02-05 14:50:40" 135  2 
383 "2014-02-05 14:52:00" 135  1 
464 "2014-02-05 14:53:20" 135  2 
576 "2014-02-05 14:54:40" 135  2 
621 "2014-02-05 14:56:00" 135  2 
666 "2014-02-05 14:57:20" 135  1 
747 "2014-02-05 14:58:40" 135  3 
792 "2014-02-05 15:00:07" 135  1 
957 "2014-02-05 15:18:53" 135  0 

在這裏,我只選擇了一個過程,但可以有很多他們。因此,您可以在第一行中看到在下一行中處於警告狀態的此過程,他會變爲OK。這就是說,在15:41:22和15:42:01之間的時間間隔處於警告狀態。然後再次警告狀態等。所以在這裏我們可以找到6個警告間隔,2個關鍵和1個未知。 這個任務是計算在一定時間內每個狀態的進程的時間長度。

+1

你能告訴我們你試過了什麼,出了什麼問題? – 2014-10-17 15:17:09

回答

1

你真正想要的是lead()函數,但MySQL不支持。爲了讓接下來的時間,使用相關子查詢:

select t.*, 
     (select state_time 
     from atable t2 
     where t2.process_id = t.process_id and 
       t2.state_time > t.state_time and 
       t2.state <> t.state 
     ) as next_state_time 
from atable t; 

出於性能考慮,你會希望在atable(process_id, state_time, state)的索引。

下一個問題是聚合時間。這裏有一個方法:

select process_id, state, 
     sum(timestampdiff(second, state_time, next_state_time)) as seconds 
from (select t.*, 
      (select state_time 
       from atable t2 
       where t2.process_id = t.process_id and 
        t2.state_time > t.state_time and 
        t2.state <> t.state 
      ) as next_state_time 
     from atable t 
    ) t 
group by process_id, state; 

您可以添加相應的where子句只有特定的時間之間獲得的狀態。

+0

很抱歉,這個查詢不正確。我在這張桌子上試了一下。關鍵時間應該是400秒。使用此查詢後,它顯示了我720秒... – Versus 2014-10-17 16:41:13