2015-11-18 167 views
0

計算平均值,我想在Oracle表在甲骨文

CREATE TABLE AGENT_HISTORY(
    EVENT_ID INTEGER NOT NULL, 
    AGENTID INTEGER NOT NULL, 
    EVENT_DATE DATE NOT NULL 
) 
/

CREATE TABLE CPU_HISTORY(
    CPU_HISTORY_ID INTEGER NOT NULL, 
    EVENT_ID INTEGER NOT NULL, 
    CPU_NAME VARCHAR2(50) NOT NULL, 
    CPU_VALUE NUMBER NOT NULL 
) 
/

我用這個SQL查詢來計算平均值:

----- FOR 24 HOURS CPU 
    CURSOR LAST_24_CPU_CURSOR IS 
     --SELECT EVENT_DATE, CPU FROM AGENT_HISTORY WHERE NAME = NAMEIN AND EVENT_DATE >= SYSDATE-(60*24)/1440; 

     SELECT START_DATE, NVL(AVG(CH.CPU_VALUE),0) 
      FROM (SELECT START_DATE - (LVL+1)/24 START_DATE, START_DATE - LVL/24 END_DATE 
      FROM (SELECT SYSDATE START_DATE, LEVEL LVL FROM DUAL CONNECT BY LEVEL <= 24)) 
    LEFT JOIN AGENT_HISTORY AH ON EVENT_DATE BETWEEN START_DATE AND END_DATE 
    LEFT JOIN CPU_HISTORY CH ON AH.EVENT_ID = CH.EVENT_ID 
    JOIN AGENT AG ON AH.AGENTID = AG.ID 
     WHERE AG.NAME = NAMEIN 
      GROUP BY START_DATE 
    ORDER BY 1; 

這個查詢只打印一個平均值。我想修改它打印每個小時平均值的24個值。你能幫我修改查詢嗎?

回答

0

更改start_dateto_char(start_date, 'hh24:mi')都在selectgroup by條款。

1

我想你的輸入只包含給定間隔之一的數據;由於您使用的是AGENT的INNER JOIN,並且AGENT_HISTORY過濾了AGENT,因此您將所有LEFT JOIN轉換爲內部版本。

我建議你使用代理,而是時隙之間的CROSS JOIN

with agent_history(event_date, agentid, event_id) as ( 
    select timestamp '2015-11-18 09:00:07', 1, 1001 from dual 
), 
agent(id, name) as (
    select 1, 'myAgent' from dual 
), 
cpu_history(event_id, cpu_value) as (
    select 1001, 75.2 from dual 
), 
time_slots(start_date, end_date) as (
    SELECT START_DATE - (LVL + 1)/24 START_DATE, 
       START_DATE - LVL/24 END_DATE 
      FROM (SELECT SYSDATE START_DATE, 
         LEVEL LVL 
        FROM DUAL 
       CONNECT BY LEVEL <= 24) 
) 
SELECT START_DATE, 
     NVL(AVG(CH.CPU_VALUE), 
      0) 
    FROM time_slots ts 
    CROSS JOIN AGENT AG 
    LEFT JOIN AGENT_HISTORY AH 
    ON AH.AGENTID = AG.ID 
    AND EVENT_DATE BETWEEN START_DATE AND END_DATE 
    LEFT JOIN CPU_HISTORY CH 
    ON AH.EVENT_ID = CH.EVENT_ID 
WHERE AG.NAME = 'myAgent' 
GROUP BY START_DATE 
ORDER BY 1; 

這將確保你得到完整的24行(每個時隙)。