Oracle按时间嵌套查询问题?

heyingss 2013-05-20 02:00:56
要计算数据8小时均值的最大值。比如给出8点到10点这个时间范围。也就是8点求一个1-8点的均值,9点求2-9点的均值,10点求3-10点的均值,然后求这几个均值的最大值。
我想嵌套查询,可是不知道里面的时间怎么随着外层的时间变化?
以上只是个例子,实际应用可能是几天内某个时间段各时间点8小时均值的最大值。
请问高手,SQL语句怎么写?
...全文
172 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
heyingss 2013-06-06
  • 打赏
  • 举报
回复
我尝试采用管道函数(pipelined_function)处理的。函数中利用循环分别求出各时段8小时均值。 然后调用函数结果时,再求最大值。因为我最后调用是在存储过程中处理。 感谢各位指导。结贴,散分!
  • 打赏
  • 举报
回复
那和我4L 差不多意思吧 查出来的 日期 时间段 平均值 时间范围是手动创建的一个表
heyingss 2013-05-20
  • 打赏
  • 举报
回复
请问,帅锅,必须用union all连接出所有时间才行吗?我本来想用union all来,可是一看要选全天24小时,就没敢用。
heyingss 2013-05-20
  • 打赏
  • 举报
回复
例如:内层查询如下: select avg(c.c1705_value) SlideValue ... where c1705_datetime > to_date('2013-04-01 08:00:00','yyyy-mm-dd hh24:mi:ss')- 8/24 and c1705_datetime <to_date('2013-04-01 08:00:00','yyyy-mm-dd hh24:mi:ss')... 这即是8点的均值计算,外层的时间范围是8点到10点。就是说算完8点,算9点,再算10点,依次类推,最后求这些均值的最大值。希望一条SQL语句查询出来。类似如下情况: select max(SlideValue) from( select avg(c.c1705_value) SlideValue ... where c1705_datetime > to_date('2013-04-01 08:00:00','yyyy-mm-dd hh24:mi:ss')- 8/24 and c1705_datetime <to_date('2013-04-01 08:00:00','yyyy-mm-dd hh24:mi:ss')...) where c1705_datetime >= to_date('2013-04-01 08:00:00','yyyy-mm-dd hh24:mi:ss' and c1705_datetime <=to_date('2013-04-01 10:00:00','yyyy-mm-dd hh24:mi:ss')
  • 打赏
  • 举报
回复
如果是几天的话 把里面构造的t表换成下面这段就可以了 构造出几天内每个时间段的表 来关联你的表

select distinct d1+level-1 d1,d2+level-1 d2
from 
(
select to_date('2013-05-20 '||lpad(8-8+level,2,'0')||':00:00','yyyy-mm-dd hh24:mi:ss') d1,
       to_date('2013-05-20 '||lpad(8+level-1,2,'0')||':00:00','yyyy-mm-dd hh24:mi:ss') d2
from dual
connect by level <= 12- 8 + 1 --8和12为时间范围
)
connect by level <=  3  --3为天数
hai_ge_ne 2013-05-20
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复

with t1 as
(
     select 1 c1,to_date('2013-05-20 01:01:01','yyyy-mm-dd hh24:mi:ss') c2,100 c3 from dual union all
     select 2 c1,to_date('2013-05-20 02:01:01','yyyy-mm-dd hh24:mi:ss') c2,200 c3 from dual union all
     select 3 c1,to_date('2013-05-20 03:01:01','yyyy-mm-dd hh24:mi:ss') c2,300 c3 from dual union all
     select 4 c1,to_date('2013-05-20 04:01:01','yyyy-mm-dd hh24:mi:ss') c2,400 c3 from dual union all
     select 5 c1,to_date('2013-05-20 05:01:01','yyyy-mm-dd hh24:mi:ss') c2,500 c3 from dual union all
     select 6 c1,to_date('2013-05-20 06:01:01','yyyy-mm-dd hh24:mi:ss') c2,600 c3 from dual union all
     select 7 c1,to_date('2013-05-20 07:01:01','yyyy-mm-dd hh24:mi:ss') c2,700 c3 from dual union all
     select 8 c1,to_date('2013-05-20 08:01:01','yyyy-mm-dd hh24:mi:ss') c2,800 c3 from dual union all
     select 9 c1,to_date('2013-05-20 09:01:01','yyyy-mm-dd hh24:mi:ss') c2,900 c3 from dual union all
     select 10 c1,to_date('2013-05-20 10:01:01','yyyy-mm-dd hh24:mi:ss') c2,1000 c3 from dual union all
     select 11 c1,to_date('2013-05-20 11:01:01','yyyy-mm-dd hh24:mi:ss') c2,1100 c3 from dual union all
     select 12 c1,to_date('2013-05-20 12:01:01','yyyy-mm-dd hh24:mi:ss') c2,1200 c3 from dual
)

select to_char(d1,'yyyy-mm-dd') dt,to_char(d1,'hh24')||'-'||to_char(d2,'hh24') d_scope,avg(c3) c3
from 
(
select to_date('2013-05-20 '||lpad(8-8+level,2,'0')||':00:00','yyyy-mm-dd hh24:mi:ss') d1,
       to_date('2013-05-20 '||lpad(8+level-1,2,'0')||':00:00','yyyy-mm-dd hh24:mi:ss') d2
from dual
connect by level <= 12- 8 + 1 --8为起始小时 12为结束小时 都可以作为参数
) t left join t1 on c2 between d1 and d2 
group by to_char(d1,'yyyy-mm-dd'),to_char(d1,'hh24')||'-'||to_char(d2,'hh24')
order by to_char(d1,'yyyy-mm-dd'),to_char(d1,'hh24')||'-'||to_char(d2,'hh24')


     dt       d_scope    c3
------------------------------------------
1	2013-05-20	01-08	400
2	2013-05-20	02-09	500
3	2013-05-20	03-10	600
4	2013-05-20	04-11	700
5	2013-05-20	05-12	800
  • 打赏
  • 举报
回复
类似这种结构么 还一点 给出的时间范围 会小于8吗?

with t1 as
(
     select 1 c1,to_date('2013-05-20 01:01:01','yyyy-mm-dd hh24:mi:ss') c2,100 c3 from dual union all
     select 2 c1,to_date('2013-05-20 02:01:01','yyyy-mm-dd hh24:mi:ss') c2,200 c3 from dual union all
     select 3 c1,to_date('2013-05-20 03:01:01','yyyy-mm-dd hh24:mi:ss') c2,300 c3 from dual union all
     select 4 c1,to_date('2013-05-20 04:01:01','yyyy-mm-dd hh24:mi:ss') c2,400 c3 from dual union all
     select 5 c1,to_date('2013-05-20 05:01:01','yyyy-mm-dd hh24:mi:ss') c2,500 c3 from dual union all
     select 6 c1,to_date('2013-05-20 06:01:01','yyyy-mm-dd hh24:mi:ss') c2,600 c3 from dual union all
     select 7 c1,to_date('2013-05-20 07:01:01','yyyy-mm-dd hh24:mi:ss') c2,700 c3 from dual union all
     select 8 c1,to_date('2013-05-20 08:01:01','yyyy-mm-dd hh24:mi:ss') c2,800 c3 from dual union all
     select 9 c1,to_date('2013-05-20 09:01:01','yyyy-mm-dd hh24:mi:ss') c2,900 c3 from dual union all
     select 10 c1,to_date('2013-05-20 10:01:01','yyyy-mm-dd hh24:mi:ss') c2,1000 c3 from dual
)
  • 打赏
  • 举报
回复
给出数据 才方便下手呀 不然别人回帖写sql也要想 还要自己构造数据来写 耗时间了...
u010412956 2013-05-20
  • 打赏
  • 举报
回复
给出样例数据,并写出你期望得到的结果。

17,078

社区成员

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

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