查找表格中的间隔

时间:2014-10-17 15:14:27

标签: mysql

这是问题所在。我有一个表有不同的进程和状态与状态时间戳。例如。 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

这里我只选择了一个流程,但可能会有很多流程。因此,您可以在第一行中看到此进程在下一行的警告状态中变为正常。所以这意味着在15:41:22和15:42:01之间的间隔,它处于警告状态。然后再次警告状态等等。所以在这里我们可以找到6个警告间隔,2个严重和1个未知。 任务是计算在某个时间段内每个州的过程有多长。

1 个答案:

答案 0 :(得分: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子句,仅在特定时间之间获取状态。