日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Oracle分析函數(shù)

數(shù)據(jù)庫(kù)中的函數(shù)封裝了一些通用的功能,例如日期類(lèi)型和字符串類(lèi)型之間的轉(zhuǎn)換,每個(gè)數(shù)據(jù)庫(kù)系統(tǒng)都內(nèi)置了一些函數(shù),當(dāng)然用戶(hù)也可以自定義函數(shù)。

成都創(chuàng)新互聯(lián)公司主營(yíng)儋州網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,APP應(yīng)用開(kāi)發(fā),儋州h5微信小程序定制開(kāi)發(fā)搭建,儋州網(wǎng)站營(yíng)銷(xiāo)推廣歡迎儋州等地區(qū)企業(yè)咨詢(xún)

在Oracle數(shù)據(jù)庫(kù)中,函數(shù)可總分為單行函數(shù)、分組函數(shù)「亦稱(chēng)聚合函數(shù)」、分析函數(shù)三類(lèi)。

單行函數(shù)

單行函數(shù)分為五種類(lèi)型:字符函數(shù)、數(shù)值函數(shù)、日期函數(shù)、轉(zhuǎn)換函數(shù)、通用函數(shù)。比如:

--大小寫(xiě)控制函數(shù)

select lower('Hello World') 轉(zhuǎn)小寫(xiě), upper('Hello World') 轉(zhuǎn)大寫(xiě) from dual;

--initcap: 首字母大寫(xiě)

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

--字符控制函數(shù)

-- concat: 字符連接函數(shù), 等同于 ||

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

分組函數(shù)

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

--分組數(shù)據(jù):求各個(gè)部門(mén)的平均工資

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

--group by作用于多列: 按部門(mén),不同的工種,統(tǒng)計(jì)平均工資

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

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

--:求部門(mén)的平均工資大于2000的部門(mén)

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

分析函數(shù)

分析函數(shù)是Oracle專(zhuān)門(mén)用于解決復(fù)雜報(bào)表統(tǒng)計(jì)需求的功能強(qiáng)大的函數(shù),它可以在數(shù)據(jù)中進(jìn)行分組然后計(jì)算基于組的某種統(tǒng)計(jì)值,并且每一組的每一行都可以返回一個(gè)統(tǒng)計(jì)值,為我們分析數(shù)據(jù)提供了一種簡(jiǎn)單高效的處理方式。

在分析函數(shù)出現(xiàn)以前,我們必須使用自聯(lián)查詢(xún),子查詢(xún)或者內(nèi)聯(lián)視圖,甚至復(fù)雜的存儲(chǔ)過(guò)程實(shí)現(xiàn)的語(yǔ)句,現(xiàn)在只要一條簡(jiǎn)單的SQL語(yǔ)句就可以實(shí)現(xiàn)了,而且在執(zhí)行效率方面也有相當(dāng)大的提高。

分析函數(shù)和分組函數(shù)的不同

普通的分組函數(shù)用group by分組,每個(gè)分組返回一個(gè)統(tǒng)計(jì)值,而分析函數(shù)采用partition by分組,并且每組每行都可以返回一個(gè)統(tǒng)計(jì)值。

分析函數(shù)的形式

常用的分析函數(shù)如下所列:

 
 
 
 
  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 ...) 

分析函數(shù)常見(jiàn)應(yīng)用場(chǎng)景

一般可以解決這樣的問(wèn)題:

①查找上一年度各個(gè)銷(xiāo)售區(qū)域排名前10的員工

②按區(qū)域查找上一年度訂單總額占區(qū)域訂單總額20%以上的客戶(hù)

③查找上一年度銷(xiāo)售最差的部門(mén)所在的區(qū)域

④查找上一年度銷(xiāo)售***和最差的產(chǎn)品

我們看看上面的幾個(gè)問(wèn)題就可以感覺(jué)到這幾個(gè)查詢(xún)和我們?nèi)粘S龅降牟樵?xún)有些不同,具體有:

①需要對(duì)同樣的數(shù)據(jù)進(jìn)行不同級(jí)別的聚合操作

②需要在表內(nèi)將多條數(shù)據(jù)和同一條數(shù)據(jù)進(jìn)行多次的比較

③需要在排序完的結(jié)果集上進(jìn)行額外的過(guò)濾操作

分析函數(shù)初體驗(yàn)

簡(jiǎn)單介紹幾個(gè)分析函數(shù)的使用樣例,讓大家能夠近距離體驗(yàn)一下Oracle分析函數(shù)的強(qiáng)大,Oracle的資料還是比較好找的「相對(duì)于DB2來(lái)說(shuō)」,搜索「Oracle分析函數(shù)」關(guān)鍵字即可獲取更多相關(guān)用法,這些樣例均在scott用戶(hù)下成功運(yùn)行。

例1,顯示各部門(mén)員工的工資,并附帶顯示該部門(mén)的***工資

執(zhí)行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針對(duì)當(dāng)前所有記錄的前一條、后一條記錄,也就是表中的所有記錄 
  9.             --unbounded:不受控制的,***的 
  10.             --preceding:在...之前 
  11.             --following:在...之后 
  12.             between unbounded preceding and unbounded following) max_sal 
  13.   from emp e; 

運(yùn)行結(jié)果

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

執(zhí)行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; 

運(yùn)行結(jié)果

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

執(zhí)行SQL

 
 
 
 
  1. select empno, 
  2.        ename, 
  3.        deptno, 
  4.        sal, 
  5.        --注意rows between 1 preceding and 1 following 是指當(dāng)前行的上一行(rownum-1)到當(dāng)前行的下輛行(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; 

運(yùn)行結(jié)果

例4,***測(cè)試

執(zhí)行SQL

 
 
 
 
  1. select 
  2.        deptno 部門(mén)編號(hào),ename 員工姓名,sal 薪水,       
  3.        avg(sal) over(partition by deptno) 該部門(mén)薪水均值, 
  4.        sum(sal) over(partition by deptno) 該部門(mén)薪水總額, 
  5.        count(sal) over(partition by deptno) 部門(mén)員工數(shù)量, 
  6.        dense_rank() over(partition by deptno order by sal desc) 該人員的部門(mén)薪水排行1, 
  7.        row_number() over(partition by deptno order by sal desc) 該人員的部門(mén)薪水排行2, 
  8.        dense_rank() over(order by sal desc) 該人員的全公司薪水排行,         
  9.        min(sal) over(partition by deptno) 該部門(mén)的***薪水1 ,  
  10.        min(sal) keep(dense_rank first order by sal) over(partition by deptno) 該部門(mén)的***薪水2 ,  
  11.        first_value(sal) over(partition by deptno order by sal) 該部門(mén)的***薪水3,       
  12.        max(sal) over(partition by deptno) 該部門(mén)的***薪水1, 
  13.        max(sal) keep(dense_rank last order by sal) over(partition by deptno) 該部門(mén)的***薪水2, 
  14.        last_value(sal) over(partition by deptno order by sal) 該部門(mén)的***薪水3, 
  15.        last_value(sal) over(partition by deptno order by sal rows between unbounded preceding and unbounded following ) 該部門(mén)的***薪水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 

運(yùn)行結(jié)果

注意:

「該部門(mén)的***薪水1\2\3」等結(jié)果是一樣的,只是使用了不同的寫(xiě)法而已。

last_value()的不同寫(xiě)法導(dǎo)致「該部門(mén)的***薪水3」和「該部門(mén)的***薪水4」結(jié)果是不同的,可以這樣去理解:last_value()默認(rèn)統(tǒng)計(jì)范圍是 rows between unbounded preceding and current row,因此需要加上rows between unbounded preceding and unbounded following ,才能得到正確的統(tǒng)計(jì)結(jié)果,「該部門(mén)的***薪水4」的統(tǒng)計(jì)結(jié)果才是正確的。

【本文為專(zhuān)欄作者“朱國(guó)立”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)“開(kāi)發(fā)者圓桌”獲取聯(lián)系和授權(quán)】

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


分享名稱(chēng):Oracle分析函數(shù)
當(dāng)前路徑:http://www.5511xx.com/article/cdsicjg.html