日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 分析函数、GROUPING函数

發(fā)布時間:2024/4/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 分析函数、GROUPING函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

分析函數(shù)

over(Partition by...) 一個超級牛皮的ORACLE特有函數(shù)。天天都用ORACLE,用了快2年了。最近才接觸到這個功能強(qiáng)大而靈活的函數(shù)。真實(shí)慚愧啊!oracle的分析函數(shù)over 及開窗函數(shù) 一:分析函數(shù)over Oracle從8.1.6開始提供分析函數(shù),分析函數(shù)用于計(jì)算基于組的某種聚合值,它和聚合函數(shù)的不同之處是 對于每個組返回多行,而聚合函數(shù)對于每個組只返回一行。 下面通過幾個例子來說明其應(yīng)用。 1:統(tǒng)計(jì)某商店的營業(yè)額。 date sale1 202 153 144 185 30規(guī)則:按天統(tǒng)計(jì):每天都統(tǒng)計(jì)前面幾天的總額得到的結(jié)果:DATE SALE SUM----- -------- ------1 20 20 --1天 2 15 35 --1天+2天 3 14 49 --1天+2天+3天 4 18 67 . 5 30 97 .2:統(tǒng)計(jì)各班成績第一名的同學(xué)信息NAME CLASS S ----- ----- ---------------------- fda 1 80 ffd 1 78 dss 1 95 cfe 2 74 gds 2 92 gf 3 99 ddd 3 99 adf 3 45 asdf 3 55 3dd 3 78 通過: --select * from ( select name,class,s,rank()over(partition by class order by s desc) mm from t2) where mm=1 --得到結(jié)果:NAME CLASS S MM ----- ----- ---------------------- ---------------------- dss 1 95 1 gds 2 92 1 gf 3 99 1 ddd 3 99 1 注意:1.在求第一名成績的時候,不能用row_number(),因?yàn)槿绻嘤袃蓚€并列第一,row_number()只返回一個結(jié)果 2.rank()和dense_rank()的區(qū)別是:--rank()是跳躍排序,有兩個第二名時接下來就是第四名--dense_rank()l是連續(xù)排序,有兩個第二名時仍然跟著第三名3.分類統(tǒng)計(jì) (并顯示信息)A B C -- -- ---------------------- m a 2 n a 3 m a 2 n b 2 n b 1 x b 3 x b 2 x b 4 h b 3 select a,c,sum(c)over(partition by a) from t2 得到結(jié)果:A B C SUM(C)OVER(PARTITIONBYA) -- -- ------- ------------------------ h b 3 3 m a 2 4 m a 2 4 n a 3 6 n b 2 6 n b 1 6 x b 3 9 x b 2 9 x b 4 9 如果用sum,group by 則只能得到A SUM(C) -- ---------------------- h 3 m 4 n 6 x 9 無法得到B列值 ===== select * from test數(shù)據(jù): A B C 1 1 1 1 2 2 1 3 3 2 2 5 3 4 6---將B欄位值相同的對應(yīng)的C 欄位值加總 select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum from testA B C C_SUM 1 1 1 1 1 2 2 7 2 2 5 7 1 3 3 3 3 4 6 6---如果不需要已某個欄位的值分割,那就要用 nulleg: 就是將C的欄位值summary 放在每行后面select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum from testA B C C_SUM 1 1 1 17 1 2 2 17 1 3 3 17 2 2 5 17 3 4 6 17求個人工資占部門工資的百分比SQL> select * from salary;NAME DEPT SAL ---------- ---- ----- a 10 2000 b 10 3000 c 10 5000 d 20 4000SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;NAME DEPT SAL PERCENT ---------- ---- ----- ---------- a 10 2000 20 b 10 3000 30 c 10 5000 50 d 20 4000 100二:開窗函數(shù) 開窗函數(shù)指定了分析函數(shù)工作的數(shù)據(jù)窗口大小,這個數(shù)據(jù)窗口大小可能會隨著行的變化而變化,舉例如下: 1: over(order by salary) 按照salary排序進(jìn)行累計(jì),order by是個默認(rèn)的開窗函數(shù)over(partition by deptno)按照部門分區(qū) 2:over(order by salary range between 5 preceding and 5 following)每行對應(yīng)的數(shù)據(jù)窗口是之前行幅度值不超過5,之后行幅度值不超過5例如:對于以下列aa1222345679sum(aa)over(order by aa range between 2 preceding and 2 following)得出的結(jié)果是AA SUM---------------------- ------------------------------------------------------- 1 10 2 14 2 14 2 14 3 18 4 18 5 22 6 18 7 22 9 9 就是說,對于aa=5的一行 ,sum為 5-1<=aa<=5+2 的和對于aa=2來說 ,sum=1+2+2+2+3+4=14 ;又如 對于aa=9 ,9-1<=aa<=9+2 只有9一個數(shù),所以sum=9 ;3:其它:over(order by salary rows between 2 preceding and 4 following)每行對應(yīng)的數(shù)據(jù)窗口是之前2行,之后4行 4:下面三條語句等效: over(order by salary rows between unbounded preceding and unbounded following)每行對應(yīng)的數(shù)據(jù)窗口是從第一行到最后一行,等效:over(order by salary range between unbounded preceding and unbounded following)等效over(partition by null)常用的分析函數(shù)如下所列:row_number() over(partition by ... order by ...) rank() over(partition by ... order by ...) dense_rank() over(partition by ... order by ...) count() over(partition by ... order by ...) max() over(partition by ... order by ...) min() over(partition by ... order by ...) sum() over(partition by ... order by ...) avg() over(partition by ... order by ...) first_value() over(partition by ... order by ...) last_value() over(partition by ... order by ...) lag() over(partition by ... order by ...) lead() over(partition by ... order by ...)示例 SQL> select type,qty from test;TYPE QTY ---------- ---------- 1 6 2 9SQL> select type,qty,to_char(row_number() over(partition by type order by qty))||'/'||to_char(count(*) over(partition by type)) as cnt2 from test;TYPE QTY CNT2 ---------- ---------- ------------ 3 1/2 1 6 2/2 2 5 1/3 7 2/3 2 9 3/3SQL> select * from test; ---------- ------------------------------------------------- 1 11111 2 22222 3 33333 4 44444SQL> select t.id,mc,to_char(b.rn)||'/'||t.id)e 2 from test t,(select rownum rn from (select max(to_number(id)) mid from test) connect by rownum <=mid ))L 4 where b.rn<=to_number(t.id) order by idID MC TO_CHAR(B.RN)||'/'||T.ID --------- -------------------------------------------------- --------------------------------------------------- 1 11111 1/1 2 22222 1/2 2 22222 2/2 3 33333 1/3 3 33333 2/3 3 33333 3/344444 1/4 44444 2/4 4 44444 3/4CNOUG4 44444 4/410 rows selected*******************************************************************關(guān)于partition by這些都是分析函數(shù),好像是8.0以后才有的 row_number()和rownum差不多,功能更強(qiáng)一點(diǎn)(可以在各個分組內(nèi)從1開時排序) rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內(nèi)) dense_rank()l是連續(xù)排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重復(fù)值的 lag(arg1,arg2,arg3): arg1是從其他行返回的表達(dá)式 arg2是希望檢索的當(dāng)前行分區(qū)的偏移量。是一個正的偏移量,時一個往回檢索以前的行的數(shù)目。 arg3是在arg2表示的數(shù)目超出了分組的范圍時返回的值。1. select deptno,row_number() over(partition by deptno order by sal) from emp order by deptno; 2. select deptno,rank() over (partition by deptno order by sal) from emp order by deptno; 3. select deptno,dense_rank() over(partition by deptno order by sal) from emp order by deptno; 4. select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) from emp ord er by deptno; 5. select deptno,ename,sal,lag(ename,2,'example') over(partition by deptno order by ename) from em p order by deptno; 6. select deptno, sal,sum(sal) over(partition by deptno) from emp;--每行記錄后都有總計(jì)值 select deptno, sum(sal) from emp group by deptno; 7. 求每個部門的平均工資以及每個人與所在部門的工資差額select deptno,ename,sal ,round(avg(sal) over(partition by deptno)) as dept_avg_sal, round(sal-avg(sal) over(partition by deptno)) as dept_sal_diff from emp; ----------------------------------------------------------------------1、rollup介紹:group by后帶rollup子句的功能可以理解為:先按一定的規(guī)則產(chǎn)生多種分組,然后按各種分組統(tǒng)計(jì)數(shù)據(jù)。(至于統(tǒng)計(jì)出的數(shù)據(jù)是求和還是最大值還是平均值等這就取決于SELECT后的聚合函數(shù))。 oracle中rollup和mysql的差不多,但比mysql的強(qiáng)大(mysql只有下面的第1和第2使用方式),且oracle中rollup可以和order by一起使用。具體使用如下:1)對比沒有帶rollup的goup by :Group by A,B產(chǎn)生的分組種數(shù):1種;group by A,B 返回結(jié)果集:也就是這一種分組的結(jié)果集。2)帶rollup但group by與rollup之間沒有任何內(nèi)容 :A、Group by rollup(A ,B) 產(chǎn)生的分組種數(shù):3種;第一種:group by A,B 第二種:group by A 第三種:group by NULL返回結(jié)果集:為以上三種分組統(tǒng)計(jì)結(jié)果集的并集且未去掉重復(fù)數(shù)據(jù)。B、Group by rollup(A ,B,C) 產(chǎn)生的分組種數(shù):4種;第一種:group by A,B,C 第二種:group by A,B 第三種:group by A 第四種:group by NULL返回結(jié)果集:為以上四種分組統(tǒng)計(jì)結(jié)果集的并集且未去掉重復(fù)數(shù)據(jù)。3)帶rollup但groupby與rollup之間還包含有列信息A、Group by A , rollup(A ,B) 產(chǎn)生的分組種數(shù):3種;第一種:group by A,A,B??? 等價于group by A,B 第二種:group by A,A????? 等價于group by A 第三種:group by A,NULL? 等價于group by A返回結(jié)果集:為以上三種分組統(tǒng)計(jì)結(jié)果集的并集且未去掉重復(fù)數(shù)據(jù)。B、Group by C , rollup(A ,B) 產(chǎn)生的分組種數(shù):3種;第一種:group by C,A,B??? 第二種:group by C,A????? 第三種:group by C,NULL? 等價于group by C 返回結(jié)果集:為以上三種分組統(tǒng)計(jì)結(jié)果集的并集且未去掉重復(fù)數(shù)據(jù)。4)帶rollup且rollup子句括號內(nèi)又使用括號對列進(jìn)行組合A、Group by rollup((A ,B)) 產(chǎn)生的分組種數(shù):2種;第一種:group by A,B 第二種:group by NULL 返回結(jié)果集:為以上兩種分組統(tǒng)計(jì)結(jié)果集的并集且未去掉重復(fù)數(shù)據(jù)。B、Group by rollup(A ,(B,C)) 產(chǎn)生的分組種數(shù):3種;第一種:group by A,B,C 第二種:group by A 第三種:group by NULL 返回結(jié)果集:為以上三種分組統(tǒng)計(jì)結(jié)果集的并集且未去掉重復(fù)數(shù)據(jù)。注:對這種情況,可以理解為幾個列被括號括在一起時,就只能被看成一個整體,分組時不需要再細(xì)化。因此也可推斷rollup括號內(nèi)也頂多加到一重括號,加多重了應(yīng)該沒有任何意義(這個推斷我沒有做驗(yàn)證的哦)。2、與rollup組合使用的其它幾個輔助函數(shù):1)grouping()函數(shù):必須接受一列且只能接受一列做為其參數(shù)。參數(shù)列值為空返回1,參數(shù)列值非空返回0。(如果參數(shù)的列在rollup中,則返回1;否則返回0)2)grouping_id()函數(shù):必須接受一列或多列做為其參數(shù)。返回值為按參數(shù)排列順序,依次對各個參數(shù)使用grouping()函數(shù),并將結(jié)果值依次串成一串二進(jìn)制數(shù)然后再轉(zhuǎn)化為十進(jìn)制所得到的值。例如:grouping(A) = 0 ;grouping(B) = 1;則:grouping_id(A,B) = (01)2 = 1;grouping_id(B,A)= (10)2 =2;3)group_id()函數(shù)調(diào)用時不需要且不能傳入任何參數(shù)。返回值為某個特定的分組出現(xiàn)的重復(fù)次數(shù)(第一大點(diǎn)中的第3種情況中往往會產(chǎn)生重復(fù)的分組)。重復(fù)次數(shù)從0開始,例如某個分組第一次出現(xiàn)則返回值為0,第二次出現(xiàn)時返回值為1,……,第n次出現(xiàn)返回值為n-1。注:使用以上三個函數(shù)往往是為了過濾掉一部分統(tǒng)計(jì)數(shù)據(jù),而達(dá)到美化統(tǒng)計(jì)結(jié)果的作用。3、cube和rollup區(qū)別:帶cube子句的groupby會產(chǎn)生更多的分組統(tǒng)計(jì)數(shù)據(jù)。cube后的列有多少種組合(注意組合是與順序無關(guān)的)就會有多少種分組。1)假設(shè)有n個維度,rollup會有n個聚合:rollup(a,b)?? 統(tǒng)計(jì)列包含:(a,b)、(a)、()rollup(a,b,c)統(tǒng)計(jì)列包含:(a,b,c)、(a,b)、(a)、()……以此類推ing……2)假設(shè)有n個緯度,cube會有2的n次方個聚合:cube(a,b)???? 統(tǒng)計(jì)列包含:(a,b)、(a)、(b)、()cube(a,b,c)??統(tǒng)計(jì)列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()……以此類推ing……

oracle中的GROUP_ID、GROUPING、GROUPING_ID函數(shù)

GROUPING函數(shù)可以接受一列,返回0或者1。如果列值為空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查詢中使用。當(dāng)需要在返回空值的地方顯示某個值時,GROUPING()就非常有用。關(guān)于ROLLUP和CUBE函數(shù)的使用,請參見我的另一篇文章。http://blog.csdn.net/wh62592855/archive/2009/11/16/4817920.aspx1、在ROLLUP中對單列使用GROUPING()SQL> select division_id,sum(salary)2? from employees23? group by rollup(division_id)4? order by division_id;DIV SUM(SALARY) --- ----------- BUS???? 1610000 OPE???? 1320000 SAL???? 4936000 SUP???? 10150008881000加上GROUPING來看看SQL> select grouping(division_id),division_id,sum(salary)2? from employees23? group by rollup(division_id)4? order by division_id;GROUPING(DIVISION_ID) DIV SUM(SALARY) --------------------- --- -----------0 BUS???? 16100000 OPE???? 13200000 SAL???? 49360000 SUP???? 10150001???????? 8881000 可以看到,為空的地方返回1,非空的地方返回0。2、使用CASE轉(zhuǎn)換GROUPING()的返回值可能你會覺得前面的0和1太枯燥了,代表不了任何意義,說白了就是不夠人性化,呵呵。這個時候我們可以使用CASE來轉(zhuǎn)換為一些有意義的值。SQL> select2? case grouping(division_id)3? when 1 then 'all divisions'4? else division_id5? end as div,6? sum(salary)7? from employees28? group by rollup(division_id)9? order by division_id;DIV?????????? SUM(SALARY) ------------- ----------- BUS?????????????? 1610000 OPE?????????????? 1320000 SAL?????????????? 4936000 SUP?????????????? 1015000 all divisions???? 88810003、使用CASE和GROUPING()轉(zhuǎn)換多個列的值SQL> select2? case grouping(division_id)3? when 1 then 'all divisions'4? else division_id5? end as div,6? case grouping(job_id)7? when 1 then 'all jobs'8? else job_id9? end as job,10? sum(salary)11? from employees212? group by rollup(division_id,job_id)13? order by division_id,job_id;DIV?????????? JOB????? SUM(SALARY) ------------- -------- ----------- BUS?????????? MGR?????????? 530000 BUS?????????? PRE?????????? 800000 BUS?????????? WOR?????????? 280000 BUS?????????? all jobs???? 1610000 OPE?????????? ENG?????????? 245000 OPE?????????? MGR?????????? 805000 OPE?????????? WOR?????????? 270000 OPE?????????? all jobs???? 1320000 SAL?????????? MGR????????? 4446000 SAL?????????? WOR?????????? 490000 SAL?????????? all jobs???? 4936000DIV?????????? JOB????? SUM(SALARY) ------------- -------- ----------- SUP?????????? MGR?????????? 465000 SUP?????????? TEC?????????? 115000 SUP?????????? WOR?????????? 435000 SUP?????????? all jobs???? 1015000 all divisions all jobs???? 888100016 rows selected.4、CUBE與GROUPING()結(jié)合使用SQL> select2? case grouping(division_id)3? when 1 then 'all divisions'4? else division_id5? end as div,6? case grouping(job_id)7? when 1 then 'all jobs'8? else job_id9? end as job,10? sum(salary)11? from employees212? group by cube(division_id,job_id)13? order by division_id,job_id;DIV?????????? JOB????? SUM(SALARY) ------------- -------- ----------- BUS?????????? MGR?????????? 530000 BUS?????????? PRE?????????? 800000 BUS?????????? WOR?????????? 280000 BUS?????????? all jobs???? 1610000 OPE?????????? ENG?????????? 245000 OPE?????????? MGR?????????? 805000 OPE?????????? WOR?????????? 270000 OPE?????????? all jobs???? 1320000 SAL?????????? MGR????????? 4446000 SAL?????????? WOR?????????? 490000 SAL?????????? all jobs???? 4936000DIV?????????? JOB????? SUM(SALARY) ------------- -------- ----------- SUP?????????? MGR?????????? 465000 SUP?????????? TEC?????????? 115000 SUP?????????? WOR?????????? 435000 SUP?????????? all jobs???? 1015000 all divisions ENG?????????? 245000 all divisions MGR????????? 6246000 all divisions PRE?????????? 800000 all divisions TEC?????????? 115000 all divisions WOR????????? 1475000 all divisions all jobs???? 888100021 rows selected.5、使用GROUPING SETS子句使用GROUPING SETS子句可以只返回小計(jì)記錄。SQL> select division_id,job_id,sum(salary)2? from employees23? group by grouping sets(division_id,job_id)4? order by division_id,job_id;DIV JOB SUM(SALARY) --- --- ----------- BUS???????? 1610000 OPE???????? 1320000 SAL???????? 4936000 SUP???????? 1015000ENG????? 245000MGR???? 6246000PRE????? 800000TEC????? 115000WOR???? 14750009 rows selected. -----------------------------------------------------------------------建表:create table earnings ( ? ?earnmonth ?varchar2(32),--打工月份area varchar2(10),--地區(qū)sno varchar2(10),--打工者編號sname varchar(19),--名字times int,--次數(shù)singleincome ?number(10,2),--每次多少錢personincome ?number---當(dāng)月總收入入 )insert into earnings values('200912','北京','511601','大奎',11,30,11*30); insert into earnings values('200912','北京','511602','大凱',8,25,8*25); insert into earnings values('200912','北京','511603','小東',30,6.25,6.25*30); insert into earnings values('200912','北京','511604','大亮',16,8.25,16*8.25); insert into earnings values('200912','北京','511605','小王',11,30,11*30); insert into earnings values('200912','南京','511301','小雨',15,12.25,15*12.25); insert into earnings values('200912','南京','511302','小飯',17,16.67,17*16.67); insert into earnings values('200912','南京','511303','小妮',27,33.33,17*33.33); insert into earnings values('200912','南京','511304','小第',16,18,16*18); insert into earnings values('200912','南京','511305','小陽',11,19.88,11*19.88); insert into earnings values('201001','北京','511601','大奎',0,30,0); insert into earnings values('201001','北京','511602','大凱',14,25,14*25); insert into earnings values('201001','北京','511603','小東',19,6.25,6.25*19); insert into earnings values('201001','北京','511604','大亮',7,8.25,7*8.25); insert into earnings values('201001','北京','511605','小王',8,30,8*30); insert into earnings values('201001','南京','511301','小雨',6,12.25,6*12.25); insert into earnings values('201001','南京','511302','小飯',11,16.67,11*16.67); insert into earnings values('201001','南京','511303','小妮',13,33.33,13*33.33); insert into earnings values('201001','南京','511304','小第',20,18,20*18); insert into earnings values('201001','南京','511305','小陽',30,19.88,30*19.88); SELECT * FROM earnings1 . ?sum ?函數(shù) 統(tǒng)計(jì)總和按照月份 ?統(tǒng)計(jì)每個地區(qū)的總收入 select ?earnmonth ,area,sum(personincome) from earnings group by earnmonth,area; ------------------------------------------------------------------------------------------------------ 2 . ?rollup 函數(shù) ?-- http://blog.itpub.net/519536/viewspace-610995/--ROLLUP 分組函數(shù)可以理解為Group By分組函數(shù)封裝后的精簡用法按照月份 地區(qū)統(tǒng)計(jì)收入-- group by 函數(shù)后面接rollup ?是在純粹的 group by 的分組上再 加上對earnmonth的匯總統(tǒng)計(jì) select ?earnmonth ,area,sum(personincome) from earnings group by rollup(earnmonth,area);-- *****注意earnmonth,area 誰在前后是有區(qū)別的,影響匯總的結(jié)果是月份還是區(qū)域,-- 實(shí)現(xiàn)上面效果的普通的sql 語句 select earnmonth ,area,sum(personincome) from earnings group by earnmonth,area union all? select earnmonth ,null,sum(personincome) from earnings group by earnmonth union all? select null ,null,sum(personincome) from earnings? order by 1,2;--其他知識 上面語句中想問問這個是什么意思?? order by 1,2 根據(jù)第一列和第二列排序 相當(dāng)于 order by earnmonth ,area-- UNION 用法 http://www.w3school.com.cn/sql/sql_union.asp ------------------------------------------------------------------------------------------------------ 3 . cube 函數(shù) ?http://blog.itpub.net/519536/viewspace-610997/-- https://msdn.microsoft.com/zh-cn/library/ms175939 按照月份 地區(qū) ?進(jìn)行收入總收入 select earnmonth ,area,sum(personincome) from earnings group by cube(earnmonth,area) order by 1,2;--group by 后面接cube 是對earnmonth匯總統(tǒng)計(jì)的基礎(chǔ)上對area 在統(tǒng)計(jì)--group by ?是分組函數(shù),按照earnmonth,area先后次序分組--上面的查詢 是先按照earnmonth 分組,在earnmonth 內(nèi)部再按照area分組,并且在area組內(nèi)統(tǒng)計(jì)personincome總和 ------------------------------------------------------------------------------------------------------ 4 . grouping 函數(shù) ?http://millerrch.iteye.com/blgroupingog/1882423-- 上面的rollup 和 cube 函數(shù)都會對結(jié)果產(chǎn)生null,這時 可用grouping 來確認(rèn)該記錄是哪個字段得出來的 select earnmonth ,area,sum(personincome) from earnings group by rollup(earnmonth,area); ?-- 這是有空值的--grouping 函數(shù)的用法 帶一個參數(shù),參數(shù)是字段名稱如果是本身的結(jié)果(列值非空)就返回0,如果是合計(jì)的結(jié)果(列值為空)則返回1 select earnmonth ,(case when(grouping(area)=1 )and (grouping(earnmonth)=0 )then '月份小計(jì)' ?when(grouping(area)=1 )and (grouping(earnmonth)=1 )then '總計(jì)' else area end ) as area,sum(personincome) from earnings group by rollup(earnmonth,area); ------------------------------------------------------------------------------------------------------ 5 . rank 函數(shù),dense_rank 函數(shù),row_number 函數(shù)-- http://www.jb51.net/article/85125.htm按照 月份 地區(qū) 求打工收入排序-- ? rank 排名會有并列,兩個第一名 會按照人數(shù)跳躍產(chǎn)生名次 ?1,1,3.。。。。。。。 ?--http://www.jb51.net/article/51627.htm select ?earnmonth ,area,sname,personincome,rank () over(partition by earnmonth,area order by personincome desc ) 排名 from earnings;-- dense_rank 排名會有并列,兩個第一名 但不會按照人數(shù)跳躍產(chǎn)生名次,1,1,2.。。。。。。。 select ?earnmonth ,area,sname,personincome,dense_rank () over(partition by earnmonth,area order by personincome desc ) 排名 from earnings;-- row_number 排名不會有并列,既是兩個數(shù)據(jù)一樣,排名也不一樣,1,2,3,4。。。。。。-- http://blog.csdn.net/tanzuai/article/details/42391885 select ?earnmonth ,area,sname,personincome,row_number () over(partition by earnmonth,area order by personincome desc ) 排名 from earnings; ------------------------------------------------------------------------------------------------------ SUM ?累計(jì)求和 select earnmonth ,area,sname,personincome,sum (personincome) over(partition by sname order by personincome asc) "總收入" from earnings; ------------------------------------------------------------------------------------------------------ sum,avg.max,min綜合運(yùn)用 --按照月份,地區(qū) 求打工收入最高值,最低,平均,總和 select distinct earnmonth "月份" ,area "地區(qū)",max(personincome) over (partition by earnmonth ,area ) "max",min(personincome) over (partition by earnmonth ,area ) "min",avg(personincome) over (partition by earnmonth ,area ) "avg",sum(personincome) over (partition by earnmonth ,area ) "sum" from earnings; ---------------------

Oracle分析函數(shù)

Oracle分析函數(shù)-排序排列(rank、dense_rank、row_number、ntile)

Oracle分析函數(shù)-排序排列(rank、dense_rank、row_number、ntile) (1)rank函數(shù)返回一個唯一的值,除非遇到相同的數(shù)據(jù)時,此時所有相同數(shù)據(jù)的排名是一樣的,同時會在最后一條相同記錄和下一條不同記錄的排名之間空出排名。 (2)dense_rank函數(shù)返回一個唯一的值,除非當(dāng)碰到相同數(shù)據(jù)時,此時所有相同數(shù)據(jù)的排名都是一樣的。 (3)row_number函數(shù)返回一個唯一的值,當(dāng)碰到相同數(shù)據(jù)時,排名按照記錄集中記錄的順序依次遞增。 (4)ntile是要把查詢得到的結(jié)果平均分為幾組,如果不平均則分給第一組。例如:復(fù)制代碼 create table s_score ( s_id number(6),score number(4,2) ); insert into s_score values(001,98); insert into s_score values(002,66.5); insert into s_score values(003,99); insert into s_score values(004,98); insert into s_score values(005,98); insert into s_score values(006,80);selects_id ,score,rank() over(order by score desc) rank --按照成績排名,純排名,dense_rank() over(order by score desc) dense_rank --按照成績排名,相同成績排名一致,row_number() over(order by score desc) row_number --按照成績依次排名,ntile(3) over (order by score desc) group_s --按照分?jǐn)?shù)劃分成績梯隊(duì) from s_score; 復(fù)制代碼排名/排序的時候,有時候,我們會想到利用偽列row_num,利用row_num確實(shí)可以解決某些場景下的問題(但是相對也比較復(fù)雜),而且有些場景下的問題卻很難解決。例:取成績前三名,并且前三名含有并列的情況。通過上面例子,我們可以直觀的看到,結(jié)果應(yīng)該有5條記錄:復(fù)制代碼 selects_id ,score,dense_rank from ( selects_id ,score,rank() over(order by score desc) rank,dense_rank() over(order by score desc) dense_rank,row_number() over(order by score desc) row_number from s_score ) t where dense_rank <= 3;S_ID SCORE DENSE_RANK ------- ------ ----------3 99.00 11 98.00 25 98.00 24 98.00 26 80.00 3復(fù)制代碼 如果只是簡單的想到去用rownum <= 3 得到的結(jié)果顯然不可能是正確的。組內(nèi)的排名或者排序是經(jīng)常遇到的一種場景。 例如,取每個銷售部門內(nèi),銷售業(yè)績最好的前三名。取每個班級內(nèi)成績排名信息等等.. 取每個班級內(nèi)每門課成績排名第一的同學(xué)信息:復(fù)制代碼 drop table S_SCORE; create table S_SCORE (S_ID NUMBER(6),CLASS_ID VARCHAR2(2),COURSE VARCHAR2(20),SCORE NUMBER(5,2) );INSERT INTO S_SCORE VALUES(1001,'A','MATH','67'); INSERT INTO S_SCORE VALUES(1004,'B','MATH','88'); INSERT INTO S_SCORE VALUES(1002,'A','MATH','99'); INSERT INTO S_SCORE VALUES(1003,'A','MATH','55'); INSERT INTO S_SCORE VALUES(1001,'B','MATH','88'); INSERT INTO S_SCORE VALUES(1001,'B','MATH','70'); INSERT INTO S_SCORE VALUES(1001,'A','ORACLE','97'); INSERT INTO S_SCORE VALUES(1004,'B','ORACLE','48'); INSERT INTO S_SCORE VALUES(1002,'A','ORACLE','79'); INSERT INTO S_SCORE VALUES(1003,'A','ORACLE','65'); INSERT INTO S_SCORE VALUES(1001,'B','ORACLE','82'); INSERT INTO S_SCORE VALUES(1001,'B','ORACLE','78');selects_id,class_id,course,score,dense_rank() over (partition by class_id,course order by score desc) drk from S_SCORE;S_ID CLASS_ID COURSE SCORE DRK ------- -------- -------------------- ------- ----------1002 A MATH 99.00 11001 A MATH 67.00 21003 A MATH 55.00 31001 A ORACLE 97.00 11002 A ORACLE 79.00 21003 A ORACLE 65.00 31004 B MATH 88.00 11001 B MATH 88.00 11001 B MATH 70.00 21001 B ORACLE 82.00 11001 B ORACLE 78.00 21004 B ORACLE 48.00 3selects_id,class_id,course,score from ( selects_id,class_id,course,score,dense_rank() over (partition by class_id,course order by score desc) drk from S_SCORE ) t where drk = 1;S_ID CLASS_ID COURSE SCORE ------- -------- -------------------- -------1002 A MATH 99.001001 A ORACLE 97.001004 B MATH 88.001001 B MATH 88.001001 B ORACLE 82.00 復(fù)制代碼 rank()和dense_rank()用法相似,這里就不在舉例說明了??梢詫⑸厦娴睦又衐ense_rank()替換成rank()實(shí)現(xiàn)。接下來,看一個使用row_number()的場景 例:查看每個部門最近一筆銷售記錄:復(fù)制代碼 select * from criss_sales order by dept_id,sale_date desc;DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT ------- ----------- ---------- ----------- D01 2014/5/4 G02 80 D01 2014/4/30 G03 800 D01 2014/4/8 G01 200 D01 2014/3/4 G00 700 D02 2014/5/2 G03 900 D02 2014/4/27 G01 300 D02 2014/4/8 G02 100 D02 2014/3/6 G00 500 復(fù)制代碼 即,我們希望得到這兩條記錄:D01 2014/5/4 G02 80 D02 2014/5/2 G03 900 復(fù)制代碼 selectdept_id,sale_date,goods_type,sale_cnt,row_number() over (partition by dept_id order by sale_date desc) from criss_sales;DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT ROW_NUMBER()OVER(PARTITIONBYDE ------- ----------- ---------- ----------- ------------------------------ D01 2014/5/4 G02 80 1 D01 2014/4/30 G03 800 2 D01 2014/4/8 G01 200 3 D01 2014/3/4 G00 700 4 D02 2014/5/2 G03 900 1 D02 2014/4/27 G01 300 2 D02 2014/4/8 G02 100 3 D02 2014/3/6 G00 500 4selectdept_id,sale_date,goods_type,sale_cnt from ( selectdept_id,sale_date,goods_type,sale_cnt,row_number() over (partition by dept_id order by sale_date desc) rn from criss_sales ) t where rn = 1;DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT ------- ----------- ---------- ----------- D01 2014/5/4 G02 80 D02 2014/5/2 G03 900 復(fù)制代碼有時會有這樣的需求:如果數(shù)據(jù)排序后分為三部分,業(yè)務(wù)人員只關(guān)心其中的一部分,如何將這中間的三分之一數(shù)據(jù)拿出來呢? 這時比較好的選擇,就是使用ntile函數(shù):復(fù)制代碼 selectdept_id,sale_date,goods_type,sale_cnt,ntile(3) over (order by sale_cnt desc nulls last) all_cmp,ntile(3) over (partition by dept_id order by sale_cnt desc nulls last) all_dept from criss_sales;

?

?

總結(jié)

以上是生活随笔為你收集整理的oracle 分析函数、GROUPING函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精品国产大片免费观看 | 边打电话边做 | 天天干天天操天天拍 | 黄色网页免费 | 日韩欧美第一区 | 肉感丰满的av演员 | 阿v视频在线免费观看 | 男男野外做爰全过程69 | 国产最新在线观看 | 国产黄在线 | www奇米影视com| 午夜a视频 | 奇米影视四色在线 | 青草av在线 | 一区二区免费在线 | 妖精视频一区二区三区 | 91精品视频免费看 | 美女被c出白浆 | 日韩最新中文字幕 | 欧美精品99久久久 | 亚洲视频免费观看 | 久久天堂av综合合色蜜桃网 | 特级少妇 | 日本乱淫视频 | 国产精品xxx视频 | 亚洲激情图片区 | 亚洲欧美在线免费 | 永久免费54看片 | 国产对白videos麻豆高潮 | 中国美女囗交视频 | 四色成人av永久网址 | 亚洲欧洲综合网 | 国产福利av | 一色屋免费视频 | 国产精品每日更新 | 中文字幕久久一区 | 国产成人无码www免费视频播放 | 夜色成人网 | 在线免费观看 | 男女污污网站 | 999视频在线播放 | 中文字幕高清在线免费播放 | 国内自拍av | 少妇久久久久久 | xxxxhdvideos| 一本久道综合色婷婷五月 | 91在线看黄 | 二男一女一级一片 | 久久亚洲网站 | 无套内谢少妇高潮免费 | 亚洲av日韩av永久无码下载 | 国产一区不卡在线观看 | 日韩伊人| 国产高清视频免费在线观看 | 国产黄色片在线免费观看 | 亚洲精品视频导航 | 欧美一级免费大片 | 国产精品不卡在线 | 阿娇全套94张未删图久久 | 琪琪伦伦影院理论片 | 夜夜草视频 | 久久99伊人 | 欧美干干 | 日本少妇videos高潮 | 国产精品麻豆一区二区 | 国产又粗又大又爽视频 | 在线美女av | 天天曰夜夜操 | 黄色片视频网站 | 中文字幕日韩精品在线观看 | 成人黄色大片在线观看 | 精品久久久一区二区 | 成人性生交大免费看 | 亚洲人在线观看 | 亚洲精品欧美在线 | 国产成年人视频网站 | 久久久久亚洲色欲AV无码网站 | 91精品国产色综合久久不卡98 | 亚洲av激情无码专区在线播放 | 91干网 | 色人综合 | 亚洲欧美在线观看视频 | 欧美成人免费在线观看视频 | 精品一区二区三区视频日产 | 久久亚洲AV无码 | 色人综合| 露脸丨91丨九色露脸 | 九九热精| 中文字幕在线一区 | 在线观看欧美成人 | 国产色无码精品视频国产 | 久久亚洲热 | jizz成熟丰满日本少妇 | xxxx国产 | 丁香花电影在线观看免费高清 | 欧美午夜精品理论片a级按摩 | 欧美黑人精品一区二区 | 名人明星三级videos | 神马久久网 |