2014-12-03 33 views
0

我有SCADA数据,如:运行时间从SCADA表

event_time status 
1/01/2011 5:07:34 Running 
1/01/2011 5:14:22 Stopped 
2/01/2011 13:13:21 Running 
2/01/2011 14:14:22 Stopped 

其中显示了电机的启动信号,电机停止信号。

我怎么可能产生表像之下,显示总几分钟内运行,每天:

date runtime_mins  
1/1/2011 32:00 
2/1/2011 54:00 
3/1/2011 34:00 

感谢您的想法!

回答

1

你需要得到下一个值,你可以用outer apply做到:

select s.date, sum(datediff(seconds, s.date, snext.date)/60.0) as runtime_minutes 
from scada s outer apply 
    (select top 1 date 
     from scada s2 
     where s2.date > s.date and s2.status = 'Stopped' 
     order by s2.date desc 
    ) snext 
where s.status = 'Running' 
group by s.date; 
0

这应该工作。

;WITH CTE(
    [event_time], 
    [status]) 
    AS (
    SELECT 
      CAST('1/01/2011 5:07:34' AS DATETIME) , 
      'Running' 
    UNION ALL 
    SELECT 
      '1/01/2011 5:14:22', 
      'Stopped' 
    UNION ALL 
    SELECT 
      '2/01/2011 13:13:21', 
      'Running' 
    UNION ALL 
    SELECT 
      '2/01/2011 14:14:22', 
      'Stopped' 
    UNION ALL 
    SELECT 
      '3/01/2011 13:13:21', 
      'Running' 
    UNION ALL 
    SELECT 
      '3/01/2011 14:14:22', 
      'Stopped' 
    ) 
, cte_Running 
    AS (
    SELECT 
      * 
    FROM CTE 
    WHERE [CTE].[status] = 'Running' 
    ) 
, cte_Stopped 
    AS (
    SELECT 
      * 
    FROM CTE 
    WHERE [CTE].[status] = 'Stopped' 
    ) 
    SELECT 
      CONVERT(VARCHAR(10), [r].[event_time], 101) AS   [date] , 
      DATEDIFF(MINUTE, [r].[event_time], [s].[event_time]) AS [runtime_mins] 
    FROM cte_Running AS r 
     INNER JOIN cte_Stopped AS s 
     ON CAST(r.event_time AS DATE) = CAST(s.event_time AS DATE)