2013-05-26 4 views
0

У меня есть некоторые данные, которые регистрируют значение (объем) обычными часовыми интервалами в течение дня в базе данных оракула sql. Я ищу sql-запрос, который может найти средний объем из вхождений в прошлом, поэтому я могу вставить его в новую таблицу, основанную на том времени в прошлом. Например, каждую среду в 7 вечера до тех пор, пока мой набор данных вернется, я хочу найти, какое среднее значение было в то время по средам в 19:00 в прошлом, и выводить среднее значение в новую запись. Затем найдите среднюю запись по средам в 8 вечера, затем 9 вечера и т. Д., Пока все 7 дней в неделю не будут завершены.Sql запрос, чтобы найти средние значения прошлых значений

В первую очередь я не уверен, как увеличить это значение в sql. I думаю У меня есть запрос, который будет возвращать то, что я хочу, но я не уверен, как увеличить значения и вставить.

До сих пор у меня есть это на определенный час определенного дня:

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; 

Итак, ваш запрос должен быть примерно таким.

РЕДАКТИРОВАТЬ:

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). Внешнее соединение с таблицей, о которой идет речь, я получаю значения avg для всех комбинаций.

+0

Спасибо за ответ, который выглядит довольно хорошо. День сохраняется как временная метка, а значение часа - отдельно. Есть ли у вас какие-либо рекомендации по введению этих значений в таблицу? – Peter

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

BTW, вы можете использовать

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

вместо

to_char(day, 'D') = 3 

Таким образом, ваш запрос не будет зависеть от параметров NLS, которые могут deffer на различных средах
See example here

Смежные вопросы