Sql查询查找过去值的平均值

时间:2013-05-26 07:08:59

标签: oracle

我有一些数据会在一天中以正常的小时间隔将值(卷)记录到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;

2 个答案:

答案 0 :(得分:0)

假设day的类型为DATE

尝试这样的事情:

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');

顺便说一句,你可能会使用

to_char(day, 'dy', 'NLS_DATE_LANGUAGE=ENGLISH') = 'wed'

而不是

to_char(day, 'D') = 3

因此,您的查询将不依赖于可能在不同环境中受到影响的nls参数 See example here

答案 1 :(得分: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;

所以,你的查询应该是这样的。

修改

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)。外部加入这个与有问题的表,我得到所有组合的平均值。