1. 程式人生 > >oracle分析函式彙總

oracle分析函式彙總

一、分析函式語法

function_name(<argument>,<argument>...) over(<partition_Clause><order by_Clause><windowing_Clause>);

function_name():函式名稱

argument:引數

over( ):開窗函式

partition_Clause:分割槽子句,資料記錄集分組,group by...

order by_Clause:排序子句,資料記錄集排序,order by...

windowing_Clause:開窗子句,定義分析函式在操作行的集合,三種開窗方式:rows、range、Specifying

注:使用開窗子句時一定要有排序子句!!!

本篇未涉及開窗子句,開窗子句在另外的文章中單獨說明

二、分析函式彙總

1、count() over()  :統計分割槽中各組的行數,partition by 可選,order by 可選

select ename,esex,eage,count(*) over() from emp; --總計數
select ename,esex,eage,count(*) over(order by eage) from emp; --遞加計數
select ename,esex,eage,count(*) over(partition by esex) from emp; --分組計數
select ename,esex,eage,count(*) over(partition by esex order by eage) from emp;--分組遞加計數

2、sum() over()  :統計分割槽中記錄的總和,partition by 可選,order by 可選

select ename,esex,eage,sum(salary) over() from emp; --總累計求和
select ename,esex,eage,sum(salary) over(order by eage) from emp; --遞加累計求和
select ename,esex,eage,sum(salary) over(partition by esex) from emp; --分組累計求和
select ename,esex,eage,sum(salary) over(partition by esex order by eage) from emp; --分組遞加累計求和

3、avg() over()  :統計分割槽中記錄的平均值,partition by 可選,order by 可選

select ename,esex,eage,avg(salary) over() from emp; --總平均值
select ename,esex,eage,avg(salary) over(order by eage) from emp; --遞加求平均值
select ename,esex,eage,avg(salary) over(partition by esex) from emp; --分組求平均值
select ename,esex,eage,avg(salary) over(partition by esex order by eage) from emp; --分組遞加求平均值

4、min() over() :統計分割槽中記錄的最小值,partition by 可選,order by 可選

     max() over() :統計分割槽中記錄的最大值,partition by 可選,order by 可選

select ename,esex,eage,salary,min(salary) over() from emp; --求總最小值
select ename,esex,eage,salary,min(salary) over(order by eage) from emp; --遞加求最小值
select ename,esex,eage,salary,min(salary) over(partition by esex) from emp; --分組求最小值
select ename,esex,eage,salary,min(salary) over(partition by esex order by eage) from emp; --分組遞加求最小值
select ename,esex,eage,salary,max(salary) over() from emp; --求總最大值
select ename,esex,eage,salary,max(salary) over(order by eage) from emp; --遞加求最大值
select ename,esex,eage,salary,max(salary) over(partition by esex) from emp; --分組求最大值
select ename,esex,eage,salary,max(salary) over(partition by esex order by eage) from emp; --分組遞加求最大值

5、rank() over()  :跳躍排序,partition by 可選,order by 必選

select ename,eage,rank() over(partition by job order by eage) from emp;
select ename,eage,rank() over(order by eage) from emp;

6、dense_rank() :連續排序,partition by 可選,order by 必選

select ename,eage,dense_rank() over(partition by job order by eage) from emp;
select ename,eage,dense_rank() over(order by eage) from emp;

7、row_number() over() :排序,無重複值,partition by 可選,order by 必選

select ename,eage,row_number() over(partition by job order by eage) from emp;
select ename,eage,row_number() over(order by eage) from emp;

8、ntile(n) over() :partition by 可選,order by 必選

    n表示將分割槽內記錄平均分成n份,多出的按照順序依次分給前面的組

select ename,salary,ntile(3) over(order by salary desc) from emp;
select ename,salary,ntile(3) over(partition by job order by salary desc) from emp;

9、first_value() over() :取出分割槽中第一條記錄的欄位值,partition by 可選,order by 可選

     last_value() over() :取出分割槽中最後一條記錄的欄位值,partition by 可選,order by 可選

select ename,first_value(salary) over() from emp;
select ename,first_value(salary) over(order by salary desc) from emp;
select ename,first_value(salary) over(partition by job) from emp;                                                           
select ename,first_value(salary) over(partition by job order by salary desc) from emp;
select ename,last_value(ename) over() from emp;
select ename,last_value(ename) over(order by salary desc) from emp;
select ename,last_value(ename) over(partition by job) from emp;
select ename,last_value(ename) over(partition by job order by salary desc) from emp;

10、first :從DENSE_RANK返回的集合中取出排在最前面的一個值的行

      last :從DENSE_RANK返回的集合中取出排在最後面的一個值的行

select job,max(salary) keep(dense_rank first order by salary desc),
max(salary) keep(dense_rank last order by salary desc) from emp
group by job;

11、lag() over() :取出前n行資料,partition by 可選,order by 必選

      lead() over() :取出後n行資料,partition by 可選,order by 必選

select ename,eage,lag(eage,1,0) over(order by salary), 
lead(eage,1,0) over(order by salary) from emp;

select ename,eage,lag(eage,1) over(partition by esex order by salary),
lead(eage,1) over(partition by esex order by salary) from emp;

12、ratio_to_report(a) over(partition by b) :求按照b分組後a的值在所屬分組中總值的佔比,a的值必須為數值或數值型欄位

      partition by 可選,order by 不可選

select ename,job,salary,ratio_to_report(1) over() from emp; --給每一行賦值1,求當前行在總值的佔比,總是0.1
select ename,job,salary,ratio_to_report(salary) over() from emp; --當前行的值在所有資料中的佔比
select ename,job,salary,ratio_to_report(1) over(partition by job) from emp; --給每一行賦值1,求當前行在分組後的組內總值的佔比
select ename,job,salary,ratio_to_report(salary) over(partition by job) from emp; --當前行的值在分組後組內總值佔比

13、percent_rank() over()  :partition by 可選,order by 必選

     所在組排名序號-1除以該組所有的行數-1,排名跳躍排序

select ename,job,salary,percent_rank() over(order by salary) from emp;
select ename,job,salary,percent_rank() over(partition by job order by salary) from emp;

14、cume_dist() over() :partition by 可選,order by必選

所在組排名序號除以該組所有的行數,注意對於重複行,計算時取重複行中的最後一行的位置

select ename,job,salary,cume_dist() over(order by salary) from emp;
select ename,job,salary,cume_dist() over(partition by job order by salary) from emp;

15、precentile_cont( x ) within group(order by ...) over()    :over()中partition by可選,order by 不可選

x為輸入的百分比,是0-1之間的一個小數,返回該百分比位置的資料,若沒有則返回以下計算值(r):

a=1+( x *(N-1) )  x為輸入的百分比,N為分割槽內的記錄的行數

b=ceil ( a )  向上取整

c = floor( a ) 向下取整

r=a * 百分比位置上一條資料 + b * 百分比位置下一條資料

select ename,job,salary,percentile_cont(0.5) within group(order by salary) over() from emp;
select ename,job,salary,percentile_cont(0.5) within group(order by salary) over(partition by job) from emp;

16、precentile_disc( x ) within group(order by ...) over()   :over()中partition by可選,order by 不可選

x為輸入的百分比,是0-1之間的一個小數,返回百分比位置對應位置上的資料值,若沒有對應資料值,就取大於該分佈值的下一個值

select ename,job,salary,percentile_disc(0.5) within group(order by salary) over()from emp;
select ename,job,salary,percentile_disc(0.5) within group(order by salary) over(partition by job) from emp;

17、stddev() over():計算樣本標準差,只有一行資料時返回0,partition by 可選,order by 可選

      stddev_samp() over():計算樣本標準差,只有一行資料時返回null,partition by 可選,order by 可選

      stddev_pop() over():計算總體標準差,partition by 可選,order by 可選

select stddev(stu_age) over() from student; --計算所有記錄的樣本標準差
select stddev(stu_age) over(order by stu_age) from student; --計算遞加的樣本標準差
select stddev(stu_age) over(partition by stu_major) from student; --計算分組的樣本標準差
select stddev(stu_age) over(partition by stu_major order by stu_age) from student; --計算分組遞加的樣本標準差


select stddev_samp(stu_age) over() from student; --計算所有記錄的樣本標準差
select stddev_samp(stu_age) over(order by stu_age) from student; --計算遞加的樣本標準差
select stddev_samp(stu_age) over(partition by stu_major) from student; --計算分組的樣本標準差
select stddev_samp(stu_age) over(partition by stu_major order by stu_age) from student; --計算分組遞加的樣本標準差


select stddev_pop(stu_age) over() from student; --計算所有記錄的總體標準差
select stddev_pop(stu_age) over(order by stu_age) from student; --計算遞加的總體標準差
select stddev_pop(stu_age) over(partition by stu_major) from student; --計算分組的總體標準差
select stddev_pop(stu_age) over(partition by stu_major order by stu_age) from student;--計算分組遞加的總體標準差

18、variance() over():計算樣本方差,只有一行資料時返回0,partition by 可選,order by 可選

       var_samp() over():計算樣本方差,只有一行資料時返回null,partition by 可選,order by 可選

       var_pop() over():計算總體方差,partition by 可選,order by 可選

select variance(stu_age) over() from student; --計算所有記錄的樣本方差
select variance(stu_age) over(order by stu_age) from student; --計算遞加的樣本方差
select variance(stu_age) over(partition by stu_major) from student; --計算分組的樣本方差
select variance(stu_age) over(partition by stu_major order by stu_age) from student; --計算分組遞加的樣本方差


select var_samp(stu_age) over() from student; --計算所有記錄的樣本方差
select var_samp(stu_age) over(order by stu_age) from student; --計算遞加的樣本方差
select var_samp(stu_age) over(partition by stu_major) from student; --計算分組的樣本方差
select var_samp(stu_age) over(partition by stu_major order by stu_age) from student; --計算分組遞加的樣本方差


select var_pop(stu_age) over() from student; --記錄所有就的總體方差
select var_pop(stu_age) over(order by stu_age) from student; --計算遞加的總體方差
select var_pop(stu_age) over(partition by stu_major) from student; --計算分組的總體方差
select var_pop(stu_age) over(partition by stu_major order by stu_age) from student;--計算分組遞加的樣本方差

stddev()=sqrt( variance() )     sqrt()--求開方

stddev_samp()=sqrt( var_samp() )

stddec_pop=sqrt( var_pop() )

19、covar_samp over():返回一對錶達式的樣本協方差,partition by 可選,order by 可選

       covar_pop over(): 返回一堆表示式的總體協方差,partition by 可選,order by 可選

select covar_samp(stu_age,line) over() from student; --計算所有記錄的樣本協方差
select covar_samp(stu_age,line) over(order by stu_age) from student; --計算遞加的樣本協方差
select covar_samp(stu_age,line) over(partition by stu_major) from student; --計算分組的樣本協方差
select covar_samp(stu_age,line) over(partition by stu_major order by stu_age) from student; --計算分組遞加的樣本協方差


select covar_pop(stu_age,line) over() from student; --計算所有記錄的總體協方差
select covar_pop(stu_age,line) over(order by stu_age) from student; --計算遞加的總體協方差
select covar_pop(stu_age,line) over(partition by stu_major) from student; --計算分組的總體協方差
select covar_pop(stu_age,line) over(partition by stu_major order by stu_age) from student; --計算分組遞加的總體協方差

20、corr() over() :返回一對錶達式的相關係數,partition by 可選,order by 可選

select corr(stu_age,line) over() from student; --計算所有記錄的相關係數
select corr(stu_age,line) over(order by stu_age) from student; --計算遞加的相關係數
select corr(stu_age,line) over(partition by stu_major) from student; --計算分組的相關係數
select corr(stu_age,line) over(partition by stu_major order by stu_age) from student; --計算分組遞加的相關係數

21、REGR_ (Linear Regression) Functions:這些線性迴歸函式適合最小二乘法迴歸線,有9個不同的迴歸函式可使用