2013-05-26 39 views
0

我有一些数据,每天定期将一个值(卷)以小时为间隔记录到oracle sql数据库。我正在寻找一个可以从过去的事件中找到平均音量的sql查询,所以我可以基于过去的时间将它插入到一个新的表格中。例如,对于每个星期三下午7点,只要我的数据集返回,我想要查找过去7点的所有星期三当时的平均值,并将平均值输出为新记录。然后在星期三的晚上8点,然后是晚上9点等找到平均录音,直到一周中的所有7天都完成为止。查询查询过去值的平均值

我主要不确定如何在sql中增加这个值。我认为我有一个查询,将返回我想要的,但我不确定如何增加值和插入。

到目前为止,我有这个特定一天的特定时间:

SELECT hour,day,AVG(volume) 
FROM table 
WHERE to_char(day, 'D') = 3 and hour = 19 
GROUP BY hour,day; 

回答

0

如果我正确理解你的问题,你要运行上面的查询日间和小时的所有组合。

该查询给出了所有这样的组合。

SELECT ds, LPAD (hrs, 2, '0') hrs 
    FROM ( SELECT LEVEL ds 
       FROM DUAL 
      CONNECT BY LEVEL <= 7), 
     ( SELECT LEVEL - 1 hrs 
       FROM DUAL 
      CONNECT BY LEVEL <= 24) 
ORDER BY ds, hrs; 

因此,您的查询应该是这样的。

EDIT

INSERT INTO avg_table (days, hours, avrg) 
    WITH xweek 
     AS (SELECT ds, LPAD (hrs, 2, '0') hrs 
       FROM ( SELECT LEVEL ds 
          FROM DUAL 
        CONNECT BY LEVEL <= 7), 
        ( SELECT LEVEL - 1 hrs 
          FROM DUAL 
        CONNECT BY LEVEL <= 24)) 
    SELECT t1.ds, t1.hrs, AVG (volume) 
     FROM xweek t1, tables t2 
     WHERE  t1.ds = TO_CHAR (t2.day(+), 'D') 
      AND t1.hrs = t2.hour(+) 
    GROUP BY t1.ds, t1.hrs; 

我已经形成xweek,它返回日期和小时(24 * 7)的所有组合。外面加入这个有问题的表,我得到所有组合的平均值。

+0

感谢您的答案,这看起来不错。这一天存储为时间戳,小时值是分开的。你有什么建议将这些值插入表中? – Peter

0

假设dayDATE

尝试是这样的:

SELECT hour,to_char(day, 'D'), AVG(volume) 
FROM table 
WHERE to_char(day, 'D') = 3 and hour = 19 
GROUP BY hour,to_char(day, 'D'); 

BTW,你可能使用cosider

to_char(day, 'dy', 'NLS_DATE_LANGUAGE=ENGLISH') = 'wed' 
0而不是

to_char(day, 'D') = 3 

所以,你的查询将不依赖于可能在不同环境下deffer NLS参数
See example here