设为首页 收藏本站
查看: 532|回复: 0

[经验分享] Oracle分析函数over及开窗函数

[复制链接]

尚未签到

发表于 2016-7-29 10:37:43 | 显示全部楼层 |阅读模式
  来源:http://www.365master.com/manage/database/oracle/20080730/36178.shtml
  
  
  分析函数over 及开窗函数
  一:分析函数over
  Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。
  下面通过几个例子来说明其应用。
  1:统计某商店的营业额。
  date    sale
  1          20
  2          15
  3          14
  4          18
  5           30
  规则:按天统计:每天都统计前面几天的总额
  得到的结果:
  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:统计各班成绩第一名的同学信息
  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 
--
  
  得到结果:
  NAME  CLASS  S  MM
  ----- ----- ---------------------- ----------------------
  dss     1        95   1
  gds     2        92   1
  gf        3        99   1
  ddd     3        99   1
  注意:
  1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果
  2.rank()和dense_rank()的区别是:
  --rank()是跳跃排序,有两个第二名时接下来就是第四名
  --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
  3.分类统计 (并显示信息)
  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

  
  得到结果:
  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列值
  =====
  二:开窗函数
  开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
  1.
  
over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数 
over(partition by deptno)按照部门分区
  
  2.
  
over(order by salary range between 5 preceding and 5 following)
  
  每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5
  例如:对于以下列
  aa
  1
  2
  2
  2
  3
  4
  5
  6
  7
  9
  得出的结果是
  A  A   SUM
  ---------------------- -------------------------------------------------------
  1   1  0
  2   1  4
  2   1  4
  2   1  4
  3   1  8
  4   1  8
  5   2  2
  6   1  8
  7   2  2
  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一个数,所以sum=9 ;
  3:其它:
  
over(order by salary rows between 2 preceding and 4 following)
  
  每行对应的数据窗口是之前2行,之后4行 
  
over(order by salary rows between 2 preceding and 4 following)
  
  每行对应的数据窗口是之前2行,之后4行
  4:下面三条语句等效:
  
over(order by salary rows between unbounded preceding and unbounded following)
  
  每行对应的数据窗口是从第一行到最后一行,等效:
  
over(order by salary range between unbounded preceding and unbounded following)

http://onexin.iyunv.com/source/plugin/onexin_bigdata/https://easypm.cn/resources/img/logo.png EasyPM 让项目管理更简单 团队协作更高效
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-251084-1-1.html 上篇帖子: Oracle分析函数over及开窗函数 下篇帖子: Oracle 10g最佳20个新特性
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表