資源描述:
《Oracle函數(shù)-分析函數(shù)1》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、OVER(PARTITIONBY)函數(shù)用法2010年10月26日OVER(PARTITIONBY)函數(shù)介紹開窗函數(shù)Oracle從8.1.6開始提供分析函數(shù),分析函數(shù)用于計算基于組的某種聚合值,它和聚合函數(shù)的不同之處是:對于每個組返回多行,而聚合函數(shù)對于每個組只返回一行。開窗函數(shù)指定了分析函數(shù)工作的數(shù)據(jù)窗口大小,這個數(shù)據(jù)窗口大小可能會隨著行的變化而變化,舉例如下:1:over后的寫法:over(orderbysalary)按照salary排序進(jìn)行累計,orderby是個默認(rèn)的開窗函數(shù)over(partition
2、bydeptno)按照部門分區(qū)over(partitionbydeptnoorderbysalary)2:開窗的窗口范圍:over(orderbysalaryrangebetween5precedingand5following):窗口范圍為當(dāng)前行數(shù)據(jù)幅度減5加5后的范圍內(nèi)的。舉例:—sum(s)over(orderbysrangebetween2precedingand2following)表示力口2或2的范圍內(nèi)的求和selectname,classes,sum(s)over(orderbysrangebe
3、tween2precedingand2following)mmfromt2adf34545-45加2減2即43到47,但是s在這個范圍內(nèi)只有45asdf35555cfe274743dd378158-78在76到80范圍內(nèi)有78,80,求和得158fda180158gds29292ffd195190190198198following)口范圍為當(dāng)前行前后各移動5行。dss195ddd399gf399over(orderbysalaryrowsbetween5precedingand5舉例:一sum(s)over
4、(orderbysrowsbetween2precedingand2following)表示在上下兩彳〒之間的范圍內(nèi)selectname,class’s,sum(s)over(orderbysrowsbetween2precedingand2following)mmfromt2fda80gdsffd929546sidsdfddg959999adf345174asdf355252cfe2743323dd378379(45+55+74=174)(45+55+74+78=252)(74+55+45+78+80=33
5、2)(78+74+55+80+92=379)over(orderbysalaryrangebetweenunboundedprecedingandunboundedfollowing)或者over(orderbysalaryrowsbetweenunboundedprecedingandunboundedfollowing):窗口不做限制3、與over函數(shù)結(jié)合的幾個函數(shù)介紹row_number()over()^rank()over()和dense_rank()over()函數(shù)的使用下面以班級成績表t2來說明其
6、應(yīng)用t2表信息如下:cfe274dss195ffd195fda180gds292gf399ddd399adf345asdf3553dd378select*fromselectname,class,s,rank()over(partitionbyclassorderbysdesc)mmfromt2)wheremm=1;得到的結(jié)果是:dss1951ffd1951gds2921gf3991ddd3991注意:1.在求第一名成績的時候,不能用row_number(),因為如果同班有兩個并列第一,row_number(
7、)只返回一個結(jié)果;select*from(selectname,class,s,row_number()over(partitionbyclassorderbysdesc)mmfromt2)wheremm=1;1951--95有兩名但是只顯示一個29213991--99有兩名但也只顯喬個2.rank()和dense_rank()可以將所有的都查找出來:如上可以看到采用rank可以將并列第一名的都查找出來;rank()和dense_rank()[x另!]:—rank()是跳躍排序,有兩個第二名時接下來就是第四名
8、;selectname,class,s,rank()over(partitionbyclassorderbysdesc)mmfromt2dss1951ffd1951fda1803一直接就跳到了第二gds2921cfe2742gf3991ddd39913dd3783asdf3554adf3455mmfromt2—dense_rank()l是連續(xù)排序,有兩個第二名時仍然跟著第三名鬻ctname,clas