这是问题所在。我有一个表有不同的进程和状态与状态时间戳。例如。 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个未知。 任务是计算在某个时间段内每个州的过程有多长。
答案 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
子句,仅在特定时间之间获取状态。