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