oracle 按时间段求平均值

wang_huanming 2016-05-17 02:35:00
我现在有一个需求,就是页面有个折线图,展示一段时间内的平均值,图表上有10个点,也就是说我现在要查询10遍SQL才能求出每一段时间内的平均值,可是如果将来图表变成50个点,那我就要查询50遍,效率太低了,有没有什么好办法可以一次把所有结果都统计出来的。
说明一下:time是毫秒值,系统会吧日期转成毫秒值然后存入数据库,datetime是我为了方便查看临时加的字段,实际表中并没有该字段。
表结构

create table TEST
(
time NUMBER,
metricid NUMBER,
valueindex NUMBER,
datetime DATE,
value VARCHAR2(222)
);

insert into TEST (TIME, METRICID, VALUEINDEX, DATETIME, VALUE)
values (1463367350194, 1, 1, to_date('16-05-2016 10:55:00', 'dd-mm-yyyy hh24:mi:ss'), '10');

insert into TEST (TIME, METRICID, VALUEINDEX, DATETIME, VALUE)
values (1463367757872, 1, 1, to_date('16-05-2016 11:02:37', 'dd-mm-yyyy hh24:mi:ss'), '20');

insert into TEST (TIME, METRICID, VALUEINDEX, DATETIME, VALUE)
values (1463367777872, 1, 1, to_date('16-05-2016 11:02:57', 'dd-mm-yyyy hh24:mi:ss'), '30');

insert into TEST (TIME, METRICID, VALUEINDEX, DATETIME, VALUE)
values (1463367977872, 1, 1, to_date('16-05-2016 11:06:57', 'dd-mm-yyyy hh24:mi:ss'), '40');

insert into TEST (TIME, METRICID, VALUEINDEX, DATETIME, VALUE)
values (1463371977872, 1, 1, to_date('16-05-2016 12:12:57', 'dd-mm-yyyy hh24:mi:ss'), '50');

insert into TEST (TIME, METRICID, VALUEINDEX, DATETIME, VALUE)
values (1463373977872, 1, 1, to_date('16-05-2016 12:46:57', 'dd-mm-yyyy hh24:mi:ss'), '60');

insert into TEST (TIME, METRICID, VALUEINDEX, DATETIME, VALUE)
values (1463379977872, 1, 1, to_date('16-05-2016 14:46:57', 'dd-mm-yyyy hh24:mi:ss'), '70');

insert into TEST (TIME, METRICID, VALUEINDEX, DATETIME, VALUE)
values (1463379877872, 2, 1, to_date('16-05-2016 14:24:57', 'dd-mm-yyyy hh24:mi:ss'), '80');

...全文
972 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghx287524027 2016-05-17
  • 打赏
  • 举报
回复
分析函数走起~
卖水果的net 2016-05-17
  • 打赏
  • 举报
回复

SQL> select t.* , avg(value) over(order by time) s from test t ;
      TIME   METRICID VALUEINDEX DATETIME    VALUE               S
---------- ---------- ---------- ----------- ---------- ----------
1463367350          1          1 2016-05-16  10                 10
1463367757          1          1 2016-05-16  20                 15
1463367777          1          1 2016-05-16  30                 20
1463367977          1          1 2016-05-16  40                 25
1463371977          1          1 2016-05-16  50                 30
1463373977          1          1 2016-05-16  60                 35
1463379877          2          1 2016-05-16  80         41.4285714
1463379977          1          1 2016-05-16  70                 45
8 rows selected
SQL> drop table test purge ;
Table dropped

ORAClE SE 2016-05-17
  • 打赏
  • 举报
回复
楼上正解啊啊啊啊
xu176032 2016-05-17
  • 打赏
  • 举报
回复
也就是说我现在要查询10遍SQL才能求出每一段时间内的平均值 查10遍的sql发出来看看,你是咋查的, 直接avg不行吗,或者是要用 (num + lag(num))/2大概 这样。。先发你查10遍的sql,然后说说查10遍以后,怎么取平均值,是10遍的结果相加然后/10吗?
wang_huanming 2016-05-17
  • 打赏
  • 举报
回复
引用 1 楼 ghx287524027 的回复:
metricid NUMBER, valueindex NUMBER 这两个字段什么意思?
就是两个ID标识,可以忽略这两个字段
ghx287524027 2016-05-17
  • 打赏
  • 举报
回复
metricid NUMBER, valueindex NUMBER 这两个字段什么意思?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧