oracle的rank,over partition 使用 和lead
?http://blog.csdn.net/rokii/article/details/6429145
排列(rank ())函數(shù)。這些排列函數(shù)提供了定義一個集合(使用 PARTITION 子句),然后根據(jù)某種排序方式對這個集合內(nèi)的元素進行排列的能力,下面以scott用戶的emp表為例來說明rank over partition如何使用
?
1)查詢員工薪水并連續(xù)求和
select deptno,ename,sal,
sum(sal)over (order by ename) sum1,? /*表示連續(xù)求和*/
sum(sal)over () sum2,?????????????????????????? /*相當于求和sum(sal)*/
100* round(sal/sum(sal)over (),4) "bal%"
from emp
結(jié)果如下:
??? DEPTNO ENAME???????????? SAL?????? SUM1?????? SUM2?????? bal%
---------- ---------- ---------- ---------- ---------- ----------
??????? 20 ADAMS??????????? 1100?????? 1100????? 29025?????? 3.79
??????? 30 ALLEN??????????? 1600?????? 2700????? 29025?????? 5.51
??????? 30 BLAKE??????????? 2850?????? 5550????? 29025?????? 9.82
??????? 10 CLARK??????????? 2450?????? 8000????? 29025?????? 8.44
??????? 20 FORD???????????? 3000????? 11000????? 29025????? 10.34
??????? 30 JAMES???????????? 950????? 11950????? 29025?????? 3.27
??????? 20 JONES??????????? 2975????? 14925????? 29025????? 10.25
??????? 10 KING???????????? 5000????? 19925????? 29025????? 17.23
??????? 30 MARTIN?????????? 1250????? 21175????? 29025?????? 4.31
??????? 10 MILLER?????????? 1300????? 22475????? 29025?????? 4.48
??????? 20 SCOTT??????????? 3000????? 25475????? 29025????? 10.34
??? DEPTNO ENAME???????????? SAL?????? SUM1?????? SUM2?????? bal%
---------- ---------- ---------- ---------- ---------- ----------
??????? 20 SMITH???????????? 800????? 26275????? 29025?????? 2.76
??????? 30 TURNER?????????? 1500????? 27775????? 29025?????? 5.17
??????? 30 WARD???????????? 1250????? 29025????? 29025?????? 4.31
?
2)如下:
select deptno,ename,sal,
sum(sal)over (partition by deptno order by ename) sum1,/*表示按部門號分氏,按姓名排序并連續(xù)求和*/
sum(sal)over (partition by deptno) sum2,/*表示部門分區(qū),求和*/
sum(sal)over (partition by deptno order by sal) sum3,/*按部門分區(qū),按薪水排序并連續(xù)求和*/
100* round(sal/sum(sal)over (),4) "bal%"
from emp
結(jié)果如下:
??? DEPTNO ENAME???????????? SAL?????? SUM1?????? SUM2?????? SUM3?????? bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
??????? 10 CLARK??????????? 2450?????? 2450?????? 8750?????? 3750?????? 8.44
??????? 10 KING???????????? 5000?????? 7450?????? 8750?????? 8750????? 17.23
??????? 10 MILLER?????????? 1300?????? 8750?????? 8750?????? 1300?????? 4.48
??????? 20 ADAMS??????????? 1100?????? 1100????? 10875?????? 1900?????? 3.79
??????? 20 FORD???????????? 3000?????? 4100????? 10875????? 10875????? 10.34
??????? 20 JONES??????????? 2975?????? 7075????? 10875?????? 4875????? 10.25
??????? 20 SCOTT??????????? 3000????? 10075????? 10875????? 10875????? 10.34
??????? 20 SMITH???????????? 800????? 10875????? 10875??????? 800?????? 2.76
??????? 30 ALLEN??????????? 1600?????? 1600?????? 9400?????? 6550?????? 5.51
??????? 30 BLAKE??????????? 2850?????? 4450?????? 9400?????? 9400?????? 9.82
??????? 30 JAMES???????????? 950?????? 5400?????? 9400??????? 950?????? 3.27
??? DEPTNO ENAME???????????? SAL?????? SUM1?????? SUM2?????? SUM3?????? bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
??????? 30 MARTIN?????????? 1250?????? 6650?????? 9400?????? 3450?????? 4.31
??????? 30 TURNER?????????? 1500?????? 8150?????? 9400?????? 4950?????? 5.17
??????? 30 WARD???????????? 1250?????? 9400?????? 9400?????? 3450?????? 4.31
?
3)如下:
select empno,deptno,sal,
sum(sal)over (partition by deptno) "deptSum",/*按部門分區(qū),并求和*/
rank ()over (partition by deptno order by sal desc nulls last)? rank , /*按部門分區(qū),按薪水排序并計算序號*/
dense_rank()over (partition by deptno order by sal desc nulls last) d_rank,
row_number()over (partition by deptno order by sal desc nulls last) row_rank
from emp
注:
rang()主要用于排序,并給出序號
dense_rank():功能同rank ()一樣,區(qū)別在于,rank ()對于排序并的數(shù)據(jù)給予相同序號,接下來的數(shù)據(jù)序號直接跳中躍,dense_rank()則不是,比如數(shù)據(jù):
???????????? 1,2,2,4,5,6.。。。。這是rank ()的形式
???????????? 1,2,2,3,4,5,。。。。這是dense_rank()的形式
???????????? 1,2,3,4,5,6.。。。。。這是row_number()涵數(shù)形式
row_number()則是按照順序依次使用,相當于我們普通查詢里的rownum值
?
?
其實從上面三個例子當中,不難看出over (partition by ... order by ...)的整體概念,我理解是
partition by :按照指字的字段分區(qū),如果沒有則針對全體數(shù)據(jù)
order by????? :按照指定字段進行連續(xù)操作(如求和(sum),排序(rank ()等),如果沒有指定,就相當于對指定分區(qū)集合內(nèi)的數(shù)據(jù)進行整體sum操作
?
http://keke-wanwei.iteye.com/blog/138632
首先,要了解rank在英語的意思:等級.也就是說這是一個給數(shù)據(jù)確定等級的函數(shù).
以銷售為例,有地區(qū),年,月,銷售員,銷售額,記錄這五個字段.我們可以按地區(qū),年,月,銷售額對銷售員進行排序,這樣對銷售員來說就相當于有一個等級概念了,第一名就是銷售最高的......,如果我們要找出每個地區(qū),年,月,銷售額的前三名銷售員.SQL如何寫?
java 代碼現(xiàn)在RANK 就是1,2,3,3,3,6,有了這個字段,就很容易得到前三名的銷售員了.
新問題:銷售額50000塊在深圳,2007年5月能排到第幾?
sql 代碼上面這個SQL就可以搞定了.要注意的是,Rank()里的參數(shù)必須為常數(shù),或常值表達式,里面參數(shù)的個數(shù),類型也要和order by后字段的類型相對應(yīng).
上面就是Rank函數(shù)的兩個用法.另外還有一個dense_rank(),它的用法和rank()一樣,只是計算等級的方式不同.例如上面的
1,2,3,3,3,6.用dense_rank() 就是1,2,3,3,3,4.
?
http://blog.csdn.net/maqinqin/article/details/3320247
若不是這次使用oracle lead,我還不會發(fā)現(xiàn),原來還有這么好用的東西。
???? oracle 統(tǒng)計分析函數(shù) lead
???? 語法結(jié)構(gòu):
???? lead(value_expr [,offset][,default]) over([query_partition_clause] order by Order_by_clause)
???? 參數(shù)說明:
?????value_expr 值表達式,通常是字段,也可是是表達式。value_expr本身不支持分析函數(shù),也就是lead不支持多層調(diào)用。
?????offset 偏移,應(yīng)該是很熟悉的數(shù)學(xué)概念了,或者是相對偏移,表格來開當前行的第offset行,如果offset是整數(shù)就表示是順序下的前第n行,如果是負數(shù)就是往后第n行。 如果不提供這個參數(shù),就是默認為1.
??????default 默認值,如果沒有找到,應(yīng)該返回什么值的意思,有點類似nvl(col,value)。如果沒有設(shè)置,且找不到,那么就返回Null
??????over? 可以簡單地翻譯為在什么。。。的基礎(chǔ)之上
??????query_partition_clause? 分區(qū)語句,對結(jié)果集合分區(qū)的語句,是可選的,如果沒有就是所有的一個分區(qū)。
??????Order_by_clause 排序語句 必須需要 ,形如order by xxx desc/asc
?
??? ?解釋示例:
?????SQL> select * from test_value;
??? ???
??? ??? ????? MONS JJR?????????????? CJL?????? CJJE
??? ??? ---------- ---------- ---------- ----------
??? ??? ??? 200801 LZF?????????????? 250?????? 1999
??? ??? ??? 200802 LZF?????????????? 200?????? 2000
??? ??? ??? 200803 LZF?????????????? 300?????? 1000
??? ??? ??? 200804 LZF??????????????? 23??????? 189
??? ??? ??? 200805 LZF?????????????? 356??????? 456
??? ??? ??? 200806 LZF?????????????? 100??????? 200
??? ??? ??? 200807 LZF?????????????? 600??????? 700
??? ??? ??? 200808 LZF??????????????? 23??????? 123
??? ??? ??? 200809 LZF?????????????? 400??????? 500
??? ???
??? ??? 9 rows selected
??? ???
??? ??? SQL>
??? ??? SQL> select rownum 序號,Mons,cjl cjl_01,
??? ??? ? 2? lead(cjl,1) over (order by mons desc) cjl_02,
??? ??? ? 3? lead(cjl,2) over (order by mons desc) cjl_03,
??? ??? ? 4? lead(cjl,3) over (order by mons desc) cjl_04,
??? ??? ? 5? lead(cjl,4) over (order by mons desc) cjl_05,
??? ??? ? 6? lead(cjl,5) over (order by mons desc) cjl_06,
??? ??? ? 7? lead(cjl,6) over (order by mons desc) cjl_07,
??? ??? ? 8? lead(cjl,7) over (order by mons desc) cjl_08,
??? ??? ? 9? lead(cjl,8) over (order by mons desc) cjl_09
??? ??? ?10?? from test_value
????????????? 序號?????? MONS???? CJL_01???? CJL_02???? CJL_03???? CJL_04???? CJL_05???? CJL_06???? CJL_07???? CJL_08???? CJL_09
??? ??? ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
??? ??? ???????? 9???? 200809??????? 400???????? 23??????? 600??????? 100??????? 356???????? 23??????? 300??????? 200??????? 250
??? ??? ???????? 8???? 200808???????? 23??????? 600??????? 100??????? 356???????? 23??????? 300??????? 200??????? 250
??? ??? ???????? 7???? 200807??????? 600??????? 100??????? 356???????? 23??????? 300??????? 200??????? 250???????????
??? ??? ???????? 6???? 200806??????? 100??????? 356???????? 23??????? 300??????? 200??????? 250??????????????????????
??? ??? ???????? 5???? 200805??????? 356???????? 23??????? 300??????? 200??????? 250?????????????????????????????????
??? ??? ???????? 4???? 200804???????? 23??????? 300??????? 200??????? 250????????????????????????????????????????????
??? ??? ???????? 3???? 200803??????? 300??????? 200??????? 250???????????????????????????????????????????????????????
??? ??? ???????? 2???? 200802??????? 200??????? 250??????????????????????????????????????????????????????????????????
??? ??? ???????? 1???? 200801??????? 250???????????????????
??實踐使用示例:??????????
?? select id,lead(id,1)over(partition by? call_req_id order by call_req_id ,id),type,analyst,time_stamp from act_log order by call_req_id ,id
?
總結(jié)
以上是生活随笔為你收集整理的oracle的rank,over partition 使用 和lead的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle中start with...
- 下一篇: [WCF]利用net.tcp傳輸協定來建