我有一个系统,通过在事件发生时记录事件记录来跟踪机器状态(即:机器停止,机器启动)。对于指定的日期范围,我需要将机器利用率计算为机器运行时间与可用时间的百分比。 根据该计算机的事件记录,我需要帮助总计在用户指定的时间段内机器停机或启动的时间。以下是可用于计算的简单数据版本。
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。 谢谢你的时间。如果我能提供任何有用的其他信息,请告诉我。
答案 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';