获取Oracle中的时间段的平均值

时间:2014-10-31 15:10:48

标签: sql oracle average

我有这个表可以容纳大量数据。每隔5分钟将插入带有数据的新SQL查询。

 EVENTID   EVENTDATE             CPU
--------- --------------------- --------
   23523   2014-10-28 20:26:51       33
 2234234   2014-10-28 20:27:05       22
     234   2014-10-28 20:27:19      234
      22   2014-10-28 20:27:29       22
     234   2014-10-28 20:30:13      234
     234   2014-10-28 20:38:18    23234
     234   2014-10-28 21:50:06      234
     234   2014-10-28 20:41:51    12312
     234   2014-09-30 23:00:34      123
     234   2014-11-28 21:18:23      234
     234   2014-10-30 21:24:28      234
     234   2014-10-29 21:27:52    23434

我想在图表中显示数据30天。但我有两个问题。

我想用30个值将所有数据的平均值显示在表中。

首先,我需要获得每个时间间隔的平均值。其次,我想将结果限制为30个值。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

select trunc(eventdate, 'DD'), avg(cpu)
from tab where eventdate >= trunc(sysdate) - 30
group by trunc(eventdate, 'DD') 
order by 1;

trunc(eventdate, 'DD')从eventdate中删除时间。当您按此表达式进行分组时,Oracle会每天计算平均值。

如果你想要显示30行,你可以创建一个带有一些特殊查询的连接,返回结果日期:

select start_date, avg(cpu)
from (select start_date + lvl start_date, start_date + lvl + 1 - 1/24/60/60 end_date
       from (select trunc(sysdate-30) start_date, level lvl from dual connect by level <= 30))
     left join tab on eventdate between start_date and end_date   
group by start_date
order by 1;