• 主页
  • Oracle 基础和管理
  • Oracle 高级技术
  • Oracle 认证与考试
  • 职位交流

求教高效率的解决方案

l_agang 2011-07-06 01:47:43
需求如下:
现在有一个从实时数据库取数的数据表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;

这样做效率很低,在数据量很大的情况下效率就更低了。
哪位高人指点一下,如何做比较好.
...全文
106 点赞 收藏 6
写回复
6 条回复
hanzs 2011年07月06日
你可以建一个临时表,里面只存放一个点的数据,即5分钟 然后在临时表上进行计算并写入展现表,之后truncate临时表

用存储过程,通过job每五分钟执行一次这样的操作
回复 点赞
dzxccsu 2011年07月06日

SELECT t.Get_Time,
(MAX(DECODE(t.Tag_Id, 'XXXX_001', Reading)) +
MAX(DECODE(t.Tag_Id, 'YYYY_001', Reading))) *
MAX(DECODE(t.Tag_Id, 'ZZZZ_001', Reading)) val
FROM Dat_Tag t
GROUP BY t.Get_Time
这种写法有何错误?
回复 点赞
l_agang 2011年07月06日
谢谢各位
hanzs的方法应该可行,但也会存在效率问题。

ulihss的方法应该是行不通的,达不到我们的要求。

hudingchen,我们的数据是每5分钟一个点,数据是不断增长的,你那样写应该是不行。

请大家继续指教。
回复 点赞
hudingchen 2011年07月06日
表里数据是不是都是间隔5分钟的?

SQL> WITH t AS (
2 SELECT 'XXXX_001' Tag_Id,10.00 Reading,'2011-07-05 12:00' Get_Time FROM DUAL UNION ALL
3 SELECT 'YYYY_001' Tag_Id,20.00 Reading,'2011-07-05 12:00' Get_Time FROM DUAL UNION ALL
4 SELECT 'ZZZZ_001' Tag_Id,30.00 Reading,'2011-07-05 12:00' Get_Time FROM DUAL UNION ALL
5 SELECT 'XXXX_001' Tag_Id,10.00 Reading,'2011-07-05 12:05' Get_Time FROM DUAL UNION ALL
6 SELECT 'YYYY_001' Tag_Id,10.00 Reading,'2011-07-05 12:05' Get_Time FROM DUAL UNION ALL
7 SELECT 'ZZZZ_001' Tag_Id,10.00 Reading,'2011-07-05 12:05' Get_Time FROM DUAL
8 )
9 SELECT t.Get_Time,
10 (MAX(DECODE(t.Tag_Id, 'XXXX_001', Reading)) +
11 MAX(DECODE(t.Tag_Id, 'YYYY_001', Reading))) *
12 MAX(DECODE(t.Tag_Id, 'ZZZZ_001', Reading)) val
13 FROM t
14 GROUP BY t.Get_Time
15 ;

GET_TIME VAL
---------------- ----------
2011-07-05 12:00 900
2011-07-05 12:05 200
回复 点赞
Kobayashi 2011年07月06日
select (reading + reading) * reading hj
from Dat_Tag
where Tag_Id = 'YYYY_001'
and Get_Time = '2011-07-05 12:00');


请问这样是不是可以签到要求???
回复 点赞
hanzs 2011年07月06日

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'
回复 点赞
发动态
发帖子
Oracle
创建于2007-09-28

6417

社区成员

5.4w+

社区内容

Oracle开发相关技术讨论
社区公告
暂无公告