使用Oracle SQL根据指定日期范围的事件记录计算机器利用率

时间:2014-06-01 03:12:45

标签: sql oracle

我有一个系统,通过在事件发生时记录事件记录来跟踪机器状态(即:机器停止,机器启动)。对于指定的日期范围,我需要将机器利用率计算为机器运行时间与可用时间的百分比。    根据该计算机的事件记录,我需要帮助总计在用户指定的时间段内机器停机或启动的时间。以下是可用于计算的简单数据版本。

Machine Name Event Time Event Code
Machine_X    5/20/2014  UP
Machine_X    5/25/2014  DOWN

使用上表中的数据,我如何计算Machine_X在2014年5月19日至2014年5月31日期间的停机时间(假设机器在开始时处于停机状态)日期范围)。    我不需要代码,只需要了解如何使用Oracle SQL语句计算此信息。如果我找不到使用纯SQL的解决方案,我将使用PL / SQL。 谢谢你的时间。如果我能提供任何有用的其他信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

您需要为每台机器添加开始日期和结束日期,然后lead() / lag()`将解决问题。

select m.MachineName,
       sum(case when EventCode = 'DOWN' then
                     lead(EventTime) over (partition by MachineName order by EventTime) - EventTime
                else 0
           end) as DownTime,
       sum(case when EventCode = 'UP' then
                     lead(EventTime) over (partition by MachineName order by EventTime) - EventTime
                else 0
           end) as UpTime
from ((select m.MachineName, et.EventTime, et.EventCode
       from (select cast('5/19/2014' as date) as EventTime, 'DOWN' as EventCode
             from dual
             select cast('5/31/2014' as date) as EventTime, NULL as EventCode
             from dual
            ) et cross join
            (select distinct MachineName from table t
            ) m
      ) union all
      (select MachineName, EventTime, EventCode
       from table t
      ) 
     ) t
where EventTime between '5/19/2014' and '5/31/2014';