成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Oracle分析函數

開發 開發工具
數據庫中的函數封裝了一些通用的功能,例如日期類型和字符串類型之間的轉換,每個數據庫系統都內置了一些函數,當然用戶也可以自定義函數。

數據庫中的函數封裝了一些通用的功能,例如日期類型和字符串類型之間的轉換,每個數據庫系統都內置了一些函數,當然用戶也可以自定義函數。

在Oracle數據庫中,函數可總分為單行函數、分組函數「亦稱聚合函數」、分析函數三類。

單行函數

單行函數分為五種類型:字符函數、數值函數、日期函數、轉換函數、通用函數。比如:

--大小寫控制函數

select lower('Hello World') 轉小寫, upper('Hello World') 轉大寫 from dual;

--initcap: 首字母大寫

select initcap('hello world') 首字符大寫 from dual;

--字符控制函數

-- concat: 字符連接函數, 等同于 ||

  1. select concat('Hello',' World'from dual; 

分組函數

分組函數「亦稱聚合函數」能在select或select的having子句中使用,當用于select子串時常常都和GROUP BY一起使用。多行函數分為接收多個輸入,返回一個輸出。比如:

--分組數據:求各個部門的平均工資

  1. select deptno,avg(sal) from emp group by deptno; 

--group by作用于多列: 按部門,不同的工種,統計平均工資

--group by作用于多列:先按照***列分組;如果相同,再按照第二列分組

  1. select deptno,job,avg(sal) from emp group by deptno,job; 

--:求部門的平均工資大于2000的部門

  1. select deptno,avg(sal) from emp group by deptno having avg(sal)>2000; 

分析函數

分析函數是Oracle專門用于解決復雜報表統計需求的功能強大的函數,它可以在數據中進行分組然后計算基于組的某種統計值,并且每一組的每一行都可以返回一個統計值,為我們分析數據提供了一種簡單高效的處理方式。

在分析函數出現以前,我們必須使用自聯查詢,子查詢或者內聯視圖,甚至復雜的存儲過程實現的語句,現在只要一條簡單的SQL語句就可以實現了,而且在執行效率方面也有相當大的提高。

分析函數和分組函數的不同

普通的分組函數用group by分組,每個分組返回一個統計值,而分析函數采用partition by分組,并且每組每行都可以返回一個統計值。

分析函數的形式

常用的分析函數如下所列:

  1. row_number() over(partition by ... order by ...)  
  2. rank() over(partition by ... order by ...)  
  3. dense_rank() over(partition by ... order by ...)  
  4. count() over(partition by ... order by ...)  
  5. max() over(partition by ... order by ...)  
  6. min() over(partition by ... order by ...)  
  7. sum() over(partition by ... order by ...)  
  8. avg() over(partition by ... order by ...)  
  9. first_value() over(partition by ... order by ...)  
  10. last_value() over(partition by ... order by ...)  
  11. lag() over(partition by ... order by ...)  
  12. lead() over(partition by ... order by ...) 

分析函數常見應用場景

一般可以解決這樣的問題:

①查找上一年度各個銷售區域排名前10的員工

②按區域查找上一年度訂單總額占區域訂單總額20%以上的客戶

③查找上一年度銷售最差的部門所在的區域

④查找上一年度銷售***和最差的產品

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

①需要對同樣的數據進行不同級別的聚合操作

②需要在表內將多條數據和同一條數據進行多次的比較

③需要在排序完的結果集上進行額外的過濾操作

分析函數初體驗

簡單介紹幾個分析函數的使用樣例,讓大家能夠近距離體驗一下Oracle分析函數的強大,Oracle的資料還是比較好找的「相對于DB2來說」,搜索「Oracle分析函數」關鍵字即可獲取更多相關用法,這些樣例均在scott用戶下成功運行。

例1,顯示各部門員工的工資,并附帶顯示該部門的***工資

執行SQL

  1. select e.deptno, 
  2.        e.empno, 
  3.        e.ename, 
  4.        e.sal, 
  5.        last_value(e.sal)  
  6.        over(partition by e.deptno  
  7.             order by e.sal rows  
  8.             --unbounded preceding and unbouned following針對當前所有記錄的前一條、后一條記錄,也就是表中的所有記錄 
  9.             --unbounded:不受控制的,***的 
  10.             --preceding:在...之前 
  11.             --following:在...之后 
  12.             between unbounded preceding and unbounded following) max_sal 
  13.   from emp e; 

運行結果

例2,按照deptno分組,然后計算每組值的總和

執行SQL

  1. select empno, 
  2.        ename, 
  3.        deptno, 
  4.        sal, 
  5.        sum(sal) over(partition by deptno order by ename) max_sal 
  6.   from emp; 

運行結果

例3,當前行的上一行(rownum-1)到當前行的下輛行(rownum+2)的匯總

執行SQL

  1. select empno, 
  2.        ename, 
  3.        deptno, 
  4.        sal, 
  5.        --注意rows between 1 preceding and 1 following 是指當前行的上一行(rownum-1)到當前行的下輛行(rownum+2)的匯總 
  6.        sum(sal) over(partition by deptno  
  7.                      order by ename  
  8.                      rows between 1 preceding and 2 following) max_sal 
  9.   from emp; 

運行結果

例4,***測試

執行SQL

  1. select 
  2.        deptno 部門編號,ename 員工姓名,sal 薪水,       
  3.        avg(sal) over(partition by deptno) 該部門薪水均值, 
  4.        sum(sal) over(partition by deptno) 該部門薪水總額, 
  5.        count(sal) over(partition by deptno) 部門員工數量, 
  6.        dense_rank() over(partition by deptno order by sal desc) 該人員的部門薪水排行1, 
  7.        row_number() over(partition by deptno order by sal desc) 該人員的部門薪水排行2, 
  8.        dense_rank() over(order by sal desc) 該人員的全公司薪水排行,         
  9.        min(sal) over(partition by deptno) 該部門的***薪水1 ,  
  10.        min(sal) keep(dense_rank first order by sal) over(partition by deptno) 該部門的***薪水2 ,  
  11.        first_value(sal) over(partition by deptno order by sal) 該部門的***薪水3,       
  12.        max(sal) over(partition by deptno) 該部門的***薪水1, 
  13.        max(sal) keep(dense_rank last order by sal) over(partition by deptno) 該部門的***薪水2, 
  14.        last_value(sal) over(partition by deptno order by sal) 該部門的***薪水3, 
  15.        last_value(sal) over(partition by deptno order by sal rows between unbounded preceding and unbounded following ) 該部門的***薪水4,   
  16.        lag(ename, 1, '00') over(order by sal desc) 薪水在自己前一位的人, 
  17.        lead(ename, 1, '00') over(order by sal desc) 薪水在自己后一位的人 
  18.   from emp e 
  19. order by deptno,sal,ename 

運行結果

注意:

「該部門的***薪水1\2\3」等結果是一樣的,只是使用了不同的寫法而已。

last_value()的不同寫法導致「該部門的***薪水3」和「該部門的***薪水4」結果是不同的,可以這樣去理解:last_value()默認統計范圍是 rows between unbounded preceding and current row,因此需要加上rows between unbounded preceding and unbounded following ,才能得到正確的統計結果,「該部門的***薪水4」的統計結果才是正確的。

【本文為51CTO專欄作者“朱國立”的原創稿件,轉載請通過作者微信公眾號“開發者圓桌”獲取聯系和授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2010-04-19 13:43:38

Oracle分析函數

2009-05-19 14:34:52

Oraclehash優化

2010-04-01 09:22:31

Oracle9i分析函

2011-04-15 13:02:56

Oracle函數

2010-11-19 16:03:20

Oracle分析表

2010-10-25 15:12:42

Oracle日期函數

2010-10-25 17:28:05

Oracle bita

2009-11-19 16:27:23

Oracle Rown

2009-11-18 14:29:37

Oracle函數

2009-11-19 11:23:08

Oracle重作日志

2011-10-14 16:12:25

Oracle云計算

2009-11-20 15:19:29

Oracle Agil

2009-11-19 14:12:16

Oracle Havi

2011-01-26 12:56:24

2010-10-25 14:47:49

Oracle系統變量函

2010-10-28 15:38:24

Oracle to_d

2009-11-16 13:47:35

Oracle SQL語

2009-11-20 13:51:14

Oracle Data

2009-11-17 13:35:40

Oracle SQL語

2010-04-14 13:22:10

Oracle系統函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄视频网站在线 | 免费一级黄 | 久久免费观看视频 | 欧美性受xxx | 精品一区二区三区四区五区 | 这里只有精品99re | 天天拍天天射 | 国产精品成人一区 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 亚洲精品粉嫩美女一区 | 日韩精品在线播放 | 欧美激情在线精品一区二区三区 | 国产一区免费 | 色香婷婷 | 久久国产精品网站 | 亚洲欧美精品在线观看 | 成人免费在线小视频 | 日本中文字幕日韩精品免费 | 色爱综合 | av中文天堂 | 国产成人网 | 午夜免费影视 | 国产伦精品 | 欧美日韩免费一区二区三区 | 中文字幕视频免费 | 日韩小视频 | 日韩欧美一区二区三区免费观看 | 极品粉嫩国产48尤物在线播放 | 久www| 欧美日韩综合一区 | 亚洲精品福利视频 | 一二区电影 | 亚洲精品一区二三区不卡 | 日韩一区二区在线免费观看 | 日韩精品成人网 | 成人国产精品久久 | 国产一区二区三区四区三区四 | 欧美国产视频 | 精品视频一区二区三区在线观看 | 二区在线观看 | 午夜色婷婷 |