频道栏目
首页 > 资讯 > Oracle > 正文

oracle之PLSQL优化查询语句——多种函数配合over()函数运用

17-04-26        来源:[db:作者]  
收藏   我要投稿

oracle之PLSQL优化查询语句——多种函数配合over()函数运用,总结下现在网上的一些列有关于over()函数的运用。over()也叫分析函数。
我个人在学习这个时赶脚网上的对这类函数的解释太过官方了,给一些基础不是特别好的理解带来些压力,我用一些大家比较通俗易懂的概念来讲解。
over分一下三种用法

over(order by clomun)
over(partition by clomun)
over(partition by clomun1 order by clomun)
--创建测试表
create table sale(sales_id varchar2(2),sales varchar2(10),dest varchar2(10),dept varchar2(10),revenue number);
--插入测试数据
insert into sale values('11','smith','hangzhou','市场',1000);
insert into sale values('12','smith','wenzhou','市场',2000);
insert into sale values('13','allen','wenzhou','渠道',3000);
insert into sale values('14','allen','wenzhou','渠道',4000);
insert into sale values('15','jekch','shanghai','渠道',2500);
insert into sale values('11','smith','hangzhou','市场',1000);
insert into sale values('12','smith','wenzhou','市场',2000);

1:over(order by clomun) 按照clmun 字段分类来做叠加操作,相同字段值相加求sum,不同字段从上到下递加求sum。当然clomun可以有多个ps :over(order by clomun1,clomun2)

select a.sales_id,
       a.sales,
       a.dest,
       a.dept,
       a.revenue,
       sum(a.revenue) over(order by a.dest) dest分类来递加销售总额   --当然这里也可以根据clomun 倒序(ps:over(order by a.dest desc))
  from sale a

2:over(partition by clomun) 按照clomun分类求sum,当然clomun可以有多个ps :over(partition by clomun1,clomun2)

select a.sales_id,
       a.sales,
       a.dest,
       a.dept,
       a.revenue,
       sum(a.revenue) over(partition by a.dept ) 按照dept来sum销售额
  from sale a

3:over(partition by clomun1 order by clomun2) 先按clomun1分类求sum,然后通过clomun2分类进行叠加
–先按照sales来区分求sum,然后再通过dept叠加

select a.sales_id,
       a.sales,
       a.dest,
       a.dept,
       a.revenue,
       sum(a.revenue) over(partition by a.dept order by a.sales) sumrevence 
  from sale a

——————————————————————————————————–华丽的分割线————————————————————————————————————
扩展几种常用函数的与over函数搭配运用。
count()函数与over的搭配 :如图先通过order by dest对表进行分类求和出现的次数,然后通过dept对分类求和的次数做叠加。

select a.sales_id,
       a.sales,
       a.dest,
       a.dept,
       a.revenue,
       count(a.sales) over(partition by a.dept order by a.dest) sum_count
  from sale a

ROW_NUMBER()函数与over的搭配:首先通过partition by dept 对数据进行分类,然后再通过order by dest 对数据进行排序。后面给大家介绍另外两种有意思的排名做法

select a.sales_id,
       a.sales,
       a.dest,
       a.dept,
       a.revenue,
       ROW_NUMBER() over(partition by a.dept order by a.dest) sum_count
  from sale a

rank()over()和dense_rank()over()函数搭配使用

rank()–值相同时,排名也相同,同时跳过相同的排名,也叫跳跃排名 。这种排名相对公平。

select a.sales_id,
       a.sales,
       a.dest,
       a.dept,
       a.revenue,
       rank() over(partition by a.dept order by a.dest) ranking
  from sale a

dense_rank()over():这种跟上面的有点相似,不同的地方就是,不会跳跃排名。这种对选手比较好,可以出现多个第一名哈哈。

select a.sales_id,
       a.sales,
       a.dest,
       a.dept,
       a.revenue,
       dense_rank() over(partition by a.dept order by a.dest) ranking
  from sale a

大概就这么多了时间也差不多, 好长时间没有写博客了,以后要坚持,也方便自己以后的查看。

相关TAG标签
上一篇:Linux运维第二谈---unit 4
下一篇:mysql必知必会读书笔记(三到九章)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站