一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - Oracle開發之分析函數簡介Over用法

Oracle開發之分析函數簡介Over用法

2019-12-28 15:15Paul Lin Oracle

本文主要是對Oracle分析函數概念的簡單介紹,同時講解了Over函數的用法,希望對大家學習分析函數有所幫助。

一、Oracle分析函數簡介:

在日常的生產環境中,我們接觸得比較多的是OLTP系統(即Online Transaction Process),這些系統的特點是具備實時要求,或者至少說對響應的時間多長有一定的要求;其次這些系統的業務邏輯一般比較復雜,可能需要經過多次的運算。比如我們經常接觸到的電子商城。

在這些系統之外,還有一種稱之為OLAP的系統(即Online Aanalyse Process),這些系統一般用于系統決策使用。通常和數據倉庫、數據分析、數據挖掘等概念聯系在一起。這些系統的特點是數據量大,對實時響應的要求不高或者根本不關注這方面的要求,以查詢、統計操作為主。

我們來看看下面的幾個典型例子:
①查找上一年度各個銷售區域排名前10的員工
②按區域查找上一年度訂單總額占區域訂單總額20%以上的客戶
③查找上一年度銷售最差的部門所在的區域
④查找上一年度銷售最好和最差的產品

我們看看上面的幾個例子就可以感覺到這幾個查詢和我們日常遇到的查詢有些不同,具體有:

①需要對同樣的數據進行不同級別的聚合操作
②需要在表內將多條數據和同一條數據進行多次的比較
③需要在排序完的結果集上進行額外的過濾操作

二、Oracle分析函數簡單實例:

下面我們通過一個實際的例子:按區域查找上一年度訂單總額占區域訂單總額20%以上的客戶,來看看分析函數的應用。

【1】測試環境:

 

復制代碼代碼如下:
SQL> desc orders_tmp;

 

 Name                           Null?    Type
 ----------------------- -------- ----------------
 CUST_NBR                    NOT NULL NUMBER(5)
 REGION_ID                   NOT NULL NUMBER(5)
 SALESPERSON_ID      NOT NULL NUMBER(5)
 YEAR                              NOT NULL NUMBER(4)
 MONTH                         NOT NULL NUMBER(2)
 TOT_ORDERS              NOT NULL NUMBER(7)
 TOT_SALES                 NOT NULL NUMBER(11,2)

【2】測試數據:

復制代碼代碼如下:
SQL> select * from orders_tmp;

 

  CUST_NBR  REGION_ID SALESPERSON_ID       YEAR      MONTH TOT_ORDERS  TOT_SALES
---------- ---------- -------------- ---------- ---------- ---------- ----------
        11          7             11                       2001          7          2      12204
         4          5              4                         2001         10         2      37802
         7          6              7                         2001          2          3       3750
        10          6              8                        2001          1          2      21691
        10          6              7                        2001          2          3      42624
        15          7             12                       2000          5          6         24
        12          7              9                        2000          6          2      50658
         1          5              2                         2000          3          2      44494
         1          5              1                         2000          9          2      74864
         2          5              4                         2000          3          2      35060
         2          5              4                         2000          4          4       6454
         2          5              1                         2000         10          4      35580
         4          5              4                         2000         12          2      39190

13 rows selected.

【3】測試語句:

 

復制代碼代碼如下:
SQL> select o.cust_nbr customer,
  o.region_id region,
  sum(o.tot_sales) cust_sales,
  sum(sum(o.tot_sales)) over(partition by o.region_id) region_sales
from orders_tmp o
where o.year = 2001
 group by o.region_id, o.cust_nbr;

 

  CUSTOMER     REGION CUST_SALES REGION_SALES
---------- ---------- ---------- ------------
         4              5      37802        37802
         7              6       3750         68065
        10             6      64315        68065
        11             7      12204        12204

三、分析函數OVER解析:

請注意上面的綠色高亮部分,group by的意圖很明顯:將數據按區域ID,客戶進行分組,那么Over這一部分有什么用呢?假如我們只需要統計每個區域每個客戶的訂單總額,那么我們只需要group by o.region_id,o.cust_nbr就夠了。但我們還想在每一行顯示該客戶所在區域的訂單總額,這一點和前面的不同:需要在前面分組的基礎上按區域累加。很顯然group by和sum是無法做到這一點的(因為聚集操作的級別不一樣,前者是對一個客戶,后者是對一批客戶)。

這就是over函數的作用了!它的作用是告訴SQL引擎:按區域對數據進行分區,然后累積每個區域每個客戶的訂單總額(sum(sum(o.tot_sales)))。

現在我們已經知道2001年度每個客戶及其對應區域的訂單總額,那么下面就是篩選那些個人訂單總額占到區域訂單總額20%以上的大客戶了

 

復制代碼代碼如下:
SQL> select *
from (select o.cust_nbr customer,
     o.region_id region,
     sum(o.tot_sales) cust_sales,
     sum(sum(o.tot_sales)) over(partition by o.region_id) region_sales
   from orders_tmp o
   where o.year = 2001
   group by o.region_id, o.cust_nbr) all_sales
 where all_sales.cust_sales > all_sales.region_sales * 0.2;

 

  CUSTOMER     REGION CUST_SALES REGION_SALES
---------- ---------- ---------- ------------
         4          5      37802        37802
        10          6      64315        68065
        11          7      12204        12204

SQL>

現在我們已經知道這些大客戶是誰了!哦,不過這還不夠,如果我們想要知道每個大客戶所占的訂單比例呢?看看下面的SQL語句,只需要一個簡單的Round函數就搞定了。

 

復制代碼代碼如下:
SQL> select all_sales.*,
  100 * round(cust_sales / region_sales, 2) || '%' Percent
from (select o.cust_nbr customer,
   o.region_id region,
   sum(o.tot_sales) cust_sales,
   sum(sum(o.tot_sales)) over(partition by o.region_id) region_sales
  from orders_tmp o
  where o.year = 2001
  group by o.region_id, o.cust_nbr) all_sales
where all_sales.cust_sales > all_sales.region_sales * 0.2;

 

  CUSTOMER     REGION CUST_SALES REGION_SALES PERCENT
---------- ---------- ---------- ------------ ----------------------------------------
         4            5                  37802        37802    100%
        10           6                  64315        68065      94%
        11           7                  12204        12204    100%

SQL>

總結:

①Over函數指明在那些字段上做分析,其內跟Partition by表示對數據進行分組。注意Partition by可以有多個字段。

②Over函數可以和其它聚集函數、分析函數搭配,起到不同的作用。例如這里的SUM,還有諸如Rank,Dense_rank等。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎影院在线免费播放 | 美女的隐私无遮挡的网页 | 精品无码国产AV一区二区三区 | 青青青手机视频在线观看 | 奇米影视在线观看 | 国产精彩视频 | 国产成人在线综合 | 日日舔 | 日韩欧美一区二区在线 | 精品亚洲永久免费精品 | 亚洲AV久久久久久久无码 | 为什么丈夫插我我却喜欢被打着插 | 久久re热在线视频精69 | 我半夜摸妺妺的奶C了她软件 | 国产精品va在线观看手机版 | 欧美成人免费观看国产 | 青青网| 免费视频左左视频 | 8x8x极品国产在线 | 99自拍视频在线观看 | 国内精品在线播放 | www射com| 国产视频一区二区 | 欧亚尺码专线欧洲s码wmy | 五月婷婷伊人网 | 日韩毛片在线视频 | 久草热8精品视频在线观看 久草草在线视视频 | 欧美破处女视频 | 强波多野结衣女教师 | 亚洲 欧美 日韩 国产 视频 | 亚洲乱亚洲乱妇41p 亚洲乱码一区二区三区国产精品 | 蜜桃影像传媒破解版 | 久操久操久操 | 国产日产精品久久久久快鸭 | 韩国三级 720p | 日韩成a人片在线观看日本 日韩不卡一区二区 | 国产精品久久久久久 | 按摩师他揉我奶好爽捏我奶 | 无人影院在线播放视频 | 日本xxx在线观看免费播放 | 我的好妈妈7中字在线观看韩国 |