2016-04-27 59 views
1

我有一个像下面的MySQL +持续时间根据状况

---------------------------------------------------- 
| NodeID   | Status | Time    | 
---------------------------------------------------- 
| 101    | Up  |2016-04-27 10:00:35 | 
---------------------------------------------------- 
| 101    | Down |2016-04-27 10:43:12 | 
---------------------------------------------------- 
| 101    | Up  |2016-04-27 11:05:48 | 
---------------------------------------------------- 
| 156    | Up  |2016-04-27 08:17:10 | 
---------------------------------------------------- 
| 156    | Up  |2016-04-27 08:56:30 | 
---------------------------------------------------- 
| 156    | Down |2016-04-27 09:06:12 | 
---------------------------------------------------- 

我试图让可用性(时间%时,每一个应用程序是向上)的数据集。 该表不能有自动增量字段,因为记录将使用计划作业连续删除。

我用行号和自我试图加入让旁边记录作为时间差为每行:

SELECT A.NodeId, A.Status, TIMESTAMPDIFF(MINUTE,A.time,B.time) AS timedifference 
FROM (

SELECT @row_number:[email protected]_number+1 AS row_number,nodeId, status, time FROM sw_node_status, 
(SELECT @row_number:=0) AS t) as A 

INNER JOIN 
(
SELECT @row_number:[email protected]_number+1 AS row_number,nodeId, status, time FROM sw_node_status, 
(SELECT @row_number:=0) AS t 
) as B ON B.row_number = (A.row_number + 1) 
ORDER BY A.NodeId ASC 

但需要较长的时间来运行,给我回来只有一个记录。 预期结果将是为:


| NodeID   | Status | Time    | Duration (mins 
---------------------------------------------------------------- 
| 101    | Up  |2016-04-27 10:00:35 | 43 
---------------------------------------------------------------- 
| 101    | Down |2016-04-27 10:43:12 | 23 
---------------------------------------------------------------- 
| 101    | Up  |2016-04-27 11:05:48 | 0 
---------------------------------------------------------------- 
| 156    | Up  |2016-04-27 08:17:10 | 39 
---------------------------------------------------------------- 
| 156    | Up  |2016-04-27 08:56:30 | 10 
---------------------------------------------------------------- 
| 156    | Down |2016-04-27 09:06:12 | 0 
---------------------------------------------------------------- 
+0

什么可以预期在给定的例子输出? – Utsav

回答

0
SELECT @prev_time:=time, 
     nodeId, status, time, 
     TIMESTAMPDIFF(MINUTE,A.time,@prev_time) AS timedifference 
FROM sw_node_status, (SELECT @prev_time:=some_initial_time) as init