Oracle SQL 之 分析函数(窗口函数)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a78270528/article/details/80190019

概述

分析函数是以一定的方法在一个与当前行相关的结果子集中进行计算,也称为窗口函数。

一般结构为:

Function(arg1 , arg2 ……) over(partition by clause order by clause windowing clause )

  • Windowing clause : rows | range between start_expr and end_expr
  • Start_expr is unbounded preceding | current row | n preceding | n following
  • End_expr is unbounded following | current row | n preceding | n following

function:是所调用的接收0个或多个参数的分析函数。分析函数包括Lag、Lead、First_value、Last_value、Rank、Dense_rank、Row_number、Percentile_cont、Ntile、Listagg等。

分区子句(partition-by-clause):按照分区列的值对数据行进行分组。所有分区列的值相同的数据行被组合为一个数据分区。

排序子句(order-by-clause):通过一列或一个表达式的值来对数据分区中的行进行排序。在分区子句中按照分区列的值来进行排序,在数据分区内的数据行按照排序列的值进行排序。使用NULLS FIRST或NULLS LAST子句可以把空值放到数据分区的最上面或最下面。

开窗子句(partition-by):用来指定不同的分区边界,而order-by子句可以改变分区内的排序顺序。

窗口函数的名字是over()函数,常用的有两个属性partition by和order by,partition by类似于group by,我们通常将group by叫做分组,而partition by称作分区,分组返回通常是一行,partition by返回的是多行。 

窗口函数的威力是与其他函数联合使用,窗口函数主要和统计函数,排名函数,错行的函数联合使用。 

不是所有的分析函数都支持开窗子句。

下面看几个例子:

测试数据

create  table t(id number,deptno number,name varchar2(20),sal number);
insert into t values(1,1,'1aa',120);
insert into t values(2,1,'2aa',300);
insert into t values(3,1,'3aa',100);
insert into t values(4,1,'4aa',99);
insert into t values(5,1,'5aa',90);
insert into t values(6,2,'6aa',87);
insert into t values(7,2,'7aa',500);
insert into t values(8,2,'8aa',200);
insert into t values(9,2,'9aa',20);
insert into t values(10,2,'10aa',30);

deptno 为部门号,sal为薪水

1、获取每个部门薪水的总数

select t.*,sum(sal)over(partition by deptno order by sal desc 
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as last_value 
from t t;
--last_value,sum为分析函数,over为开窗函数(窗口函数:分析函数分析时要处理的数据范围),
--形式如:over(partition by xxx order by yyy rows between zzz)
--窗口子句:UNBOUNDED PRECEDING表示数据范围的第一行
--current row表示数据范围的当前行
--UNBOUNDED FOLLOWING表示数据范围的最后一行

查询结果:


2、另一个实例

select t.*,sum(sal)over(partition by deptno order by sal asc 
       ROWS BETWEEN UNBOUNDED PRECEDING AND current row) as last_value 
from t t;

查询结果:


3、行转列:pivot(max(..) ... for(分组的字段)in(分组的值))

--行转列
select * from (select sal,deptno from t) 
pivot(max(sal) as max_sal,sum(sal)as sum_sal,avg(sal) as avg_sal for(deptno) in(1,2))

查询结果:


4、求分组后的组内最大数据,重复值仅取一条

select * from(
select t.*,row_number()over(partition by deptno order by sal desc) as rownuma 
from t t) a
where a.rownuma= 1

查询结果:


以上就是Oracle窗口函数的几个简单的应用。

猜你喜欢

转载自blog.csdn.net/a78270528/article/details/80190019
今日推荐