2013-05-26 71 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