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;
4

2 回答 2

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 参数,
请参见此处的示例

于 2013-05-26T07:31:53.890 回答
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)的所有组合。将这个与有问题的表连接起来,我得到所有组合的平均值。

于 2013-05-26T07:41:27.403 回答