簡體   English   中英

計算Oracle中的平均值

[英]Calculate average values in Oracle

我想計算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個值。 您能幫我修改查詢嗎?

我猜您的輸入僅包含給定時間間隔之一的數據。 由於您使用的是帶有AGENT的INNER JOIN ,而INNER JOIN又由AGENT_HISTORY過濾,因此您可以有效地將所有LEFT JOIN轉換為內部的。

我建議您在AGENT和時隙之間使用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行(每個時隙一個)。

更改start_dateto_char(start_date, 'hh24:mi')無論是在selectgroup by子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM