程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 同表多次查詢不同時段數據的oracle創建視圖方法

同表多次查詢不同時段數據的oracle創建視圖方法

編輯:Oracle數據庫基礎

Oracle創建視圖的方法相信大家都有一定的了解,下面為您介紹的是同表多次查詢不同時段數據的Oracle創建視圖方法,希望對您有所啟迪。

項目開發過程中有一個小時流量表,分別記錄每個小時每個通道的流量,簡化字段如下(只保留有效字段):
 NAME   Null?Type
------------------------------- --------- -----
IDNUMBER(19,0)
REPORT_TIME DATE
SEND_NUM    NUMBER(19,0)
SUCCESS_NUM NUMBER(19,0)
 
現在需要創建一個視圖,字段如下:通道id,上一個小時發送成功率,上第二個小時發送成功率,上第三小時發送成功率,比如:現在是14點,則需要13點,12點,11點這三個時段的分別發送成功率,如果send_num 為0,或者null,則結果為null。

Oracle創建視圖過程:

1. 時間段的處理:
to_char(sysdate,'hh24')-to_char(report_time,'hh24') 可以獲取小時差,根據結果為1,2,3 三種情況分別查詢結果。可以使用case ... when... then... end 判斷。這裡有一種情況需要注意:後面一天的小時為00 ,前一天的小時為23時,需要特殊處理,否則出現負數,這裡使用 +24 轉換為正數。這樣完成小時差的比較。

2. send_num 如果為null或者0時 作為除數的情況:
可以先處理send_num,如果為null或者0,直接不做計算處理。

3.列出完整的查詢語句:

  1. select  vmhr.v_mo,  
  2. vmhr.org_code,  
  3. case decode(sign(to_char(sysdate,'hh24')-to_char(report_time,'hh24')),-1,to_char  (sysdate,'hh24')-to_char(report_time,'hh24')+24,to_char(sysdate,'hh24')-to_char(report_time,'hh24')) when 1 then (select decode(nvl(send_num,0),0,null,nvl(success_num,0)/nvl(send_num,1)) from channel_flux where v_mo=vmhr.v_mo) end last_1_suss_rate,  
  4.  
  5. case decode(sign(to_char(sysdate,'hh24')-to_char(report_time,'hh24')),-1,to_char(sysdate,'hh24')-to_char(report_time,'hh24')+24,to_char(sysdate,'hh24')-to_char(report_time,'hh24')) when 2 then (select decode(nvl(send_num,0),0,null,nvl(success_num,0)/nvl(send_num,1)) from channel_flux where v_mo=vmhr.v_mo) end last_2_suss_rate,  
  6.  
  7. case decode(sign(to_char(sysdate,'hh24')-to_char(report_time,'hh24')),-1,to_char(sysdate,'hh24')-to_char(report_time,'hh24')+24,to_char(sysdate,'hh24')-to_char(report_time,'hh24')) when 3 then (select decode(nvl(send_num,0),0,null,nvl(success_num,0)/nvl(send_num,1)) from channel_flux where v_mo=vmhr.v_mo) end last_3_suss_rate  
  8. from channel_flux vmhr  

說明:sign(var) 是oracle內置函數,得到變量var的正負值,小於0 返回 -1,等於0返回0,大於0返回1. decode是oracle的內置函數,可以做簡單的判斷;case...when...then ... end 判斷條件,表示case 變量 when 滿足條件 then 執行語句 end 具體的使用可以查詢Oracle的幫助文檔。

4.完成查詢後,創建視圖:
create vIEw as .... ,補上上面的查詢語句,完成視圖需求。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved