求教高效率的SQL解决方案

l_agang 2011-07-06 01:50:04
需求如下:
现在有一个从实时数据库取数的数据表Dat_Tag,结构和数据大致如下
Tag_Id(位号Id),Reading(读数),Get_Time(取数时间)
XXXX_001 10.00 2011-07-05 12:00
YYYY_001 120.00 2011-07-05 12:00
ZZZZ_001 3.00 2011-07-05 12:00
XXXX_001 11.00 2011-07-05 12:05
YYYY_001 110.00 2011-07-05 12:05
ZZZZ_001 4.00 2011-07-05 12:05
......

每5分钟采集一次数据。

要呈现的数据是经过计算的数据,如:Val=(XXXX_001+YYYY_001)*ZZZZ_001
也要求每5分钟计算一个数据点。
我们准备用存储过程来完成计算,将结果保存到展现表中。
但是在计算的时候遇到问题,上面的公式我们用SQL实现如下:
select ((select reading from Dat_Tag where Tag_Id='XXXX_001' and Get_Time='2011-07-05 12:00')+(select reading from Dat_Tag where Tag_Id='YYYY_001' and Get_Time='2011-07-05 12:00'))*(select reading from Dat_Tag where Tag_Id='YYYY_001' and Get_Time='2011-07-05 12:00') from dual;

这样做效率很低,在数据量很大的情况下效率就更低了。
哪位高人指点一下,如何做比较好.
...全文
108 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangren 2011-07-06
  • 打赏
  • 举报
回复
这个本质上类似于行转列的问题,表Dat_Tag结构设计不好

可按1楼的方法来实现较好
Rotel-刘志东 2011-07-06
  • 打赏
  • 举报
回复
高效不高效要看是不是要看执行计划的,需要在那块sql语句进行调整的。
hanzs 2011-07-06
  • 打赏
  • 举报
回复
没人删你帖子 你发了两个,还是结了一个吧,免得重复回帖

你可以建一个临时表,里面只存放一个点的数据,即5分钟 然后在临时表上进行计算并写入展现表,之后truncate临时表

用存储过程,通过job每五分钟执行一次这样的操作
l_agang 2011-07-06
  • 打赏
  • 举报
回复
怎么有人删帖子啊?我另外一个被人删了:(

请高人多多指点。
hanzs 2011-07-06
  • 打赏
  • 举报
回复

--不需要三次select,一次select就能实现
select (decode(Tag_Id,'XXXX_001',reading) + decode(Tag_Id,'YYYY_001',reading)) * decode(Tag_Id,'YYYY_001',reading)
from Dat_Tag
where Get_Time = '2011-07-05 12:00'

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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