欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-27 20:33:49
oracle之PLSQL优化查询语句——多种函数配合over()函数运用,总结下现在网上的一些列有关于over()函数的运用。over()也叫分析函数。...

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

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