簡體   English   中英

在計算值中計算平均值/最小值/最大值/總計

[英]Calculate average/min/max/total in calculated values

編輯:添加 PL/SQL 腳本:

我正在運行一個腳本來計算不同表上的兩列之間的時間差。 它主要計算 CA 生成證書所花費的時間。 我想運行平均/最小/最大和過去 10 分鍾內生成的證書總數。

我設法計算了時間增量,但我不知道如何收集計算值的最小值/最大值/平均值。 (我認為我必須計算elapsed值的平均值)但我無法管理。 我是否必須聲明elapsed才能對其進行計算?

set serveroutput on
whenever sqlerror exit sql.sqlcode;
set echo off
SET VERIFY OFF
set heading off
SET FEEDBACK OFF
set serveroutput on size unlimited
set linesize 300
ALTER session SET TIME_ZONE='GMT';
Declare
vv_SchemaName VARCHAR2(15);
BEGIN
vv_SchemaName := Sys_Context('USERENV','CURRENT_SCHEMA');
FOR REVOKED IN (
select  a.transaction_id as trans_Id,
        e.eventcode,
        e.eventtime,
        a.time_received,
        round((e.eventtime - a.time_received) * 86400) as elapsed
  from      request_history_tbl a 
        join
            eventlog_tbl e
          on a.transaction_id = e.transaction_id
  where e.eventtime >= current_timestamp - 2
    and e.eventcode = '50'
    )
    LOOP
    dbms_output.put_line('average_request_time' || ...)
    dbms_output.put_line('Min_request_time' || ...)
    dbms_output.put_line('max_request_time' || ...)
   
    END LOOP;
END;

如何在 dbms_output.put_lines 中獲得 AVG/MIN/MAX?

如果我理解正確,那么您編寫的查詢可能會用作 CTE(或內聯視圖),即您將用來獲得所需內容的

with temp as
  (select a.transaction_id,
          e.eventcode,
          e.eventtime,
          a.time_received,
          (e.eventtime - a.time_received) * 86400  as diff_in_seconds       
   from request_history_tbl a join eventlog_tbl e
     on a.transaction_id = e.transaction_id
   where e.eventtime >= current_timestamp - 10/1440
     and e.eventcode = '50'
  )
select avg(diff_in_seconds) avg_diff,
       min(diff_in_seconds) min_diff,
       max(diff_in_seconds) max_diff
from temp;

切換到 PL/SQL 很容易; 在 cursor FOR 循環中使用該查詢並顯示結果:

begin
  for cur_r in 
    (select avg(diff_in_seconds) avg_diff,
            min(diff_in_seconds) min_diff,
            max(diff_in_seconds) max_diff
     from (select a.transaction_id,
             e.eventcode,
             e.eventtime,
             a.time_received,
             (e.eventtime - a.time_received) * 86400  as diff_in_seconds       
           from request_history_tbl a join eventlog_tbl e
             on a.transaction_id = e.transaction_id
           where e.eventtime >= current_timestamp - 10/1440
             and e.eventcode = '50'
          )
    ) loop
      dbms_output.put_line(cur_r.avg_diff ||', '||
                           cur_r.min_diff ||', '||
                           cur_r.max_diff);
  end loop;
end;

暫無
暫無

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

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