oracle中over()分析函数_day1

分析函数用于计算基础组的某种聚合值,分析函数对于每个组返回多行,而聚合函数对于每个组只返回一行。

select day,sale,sum(sale) over (order by day asc ) as 连续求和,sum(sale) over() as 总和 from t_temp;
oracle中over()分析函数_day1
Sum()函数后面加了over()每个组返回多行,后面就不用加group by。

为了方便理解,可以简单的把over()函数理解为对分析函数的一种条件解释,也就是给分析函数加条件,以下对sum()、rank()函数结合over的用法进行分析。

1、sum()结合over()

select a.stu_id 学号

,a.stu_name 姓名

,a.stu_class 班级

,a.stu_result 成绩

,sum(stu_result) over (partition by stu_class) 按班级求成绩总和

,sum(stu_result) over (partition by stu_class order by stu_result) 按班级累计成绩

from yangx.Y_CLASS a;

oracle中over()分析函数_day1
从结果上可以看出sum()函数对部门区分进行了求和统计,partition by 就是统计的范围条件。Order by 可以理解为对统计范围规定了一个统计顺序,一步步统计,逐步累加。

2、rank()结合over()

Rank 函数是分级函数,这个函数必须与over函数一起使用,否则会报一个“缺少窗口函数”错误。

select a.stu_id 学号 ,

a.stu_class 班级,

a.stu_result 成绩,

rank() OVER(partition by a.stu_class ORDER BY a.stu_result desc) as 班级排名

from yangx.Y_CLASS a;
oracle中over()分析函数_day1
select a.stu_id 学号,a.stu_class 班级,

a.stu_result 成绩,

rank() OVER(ORDER BY a.stu_result desc) as 班级排名

from yangx.Y_CLASS a;
oracle中over()分析函数_day1
加了partition by是把班级分块,按班级排序,如果不加partition by则对整体进行排序

1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果

2.rank()和dense_rank()的区别是:

–rank()是跳跃排序,有两个第二名时接下来就是第四名

–dense_rank()l是连续排序,有两个第二名时仍然跟着第三名

3、lag()与lead()函数

Lag 与lead函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同已字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤。这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率。

over()表示 lag()与lead()操作的数据都在over()的范围内,他里面可以使用partition by 语句(用于分组) order by 语句(用于排序)。partition by a order by b表示以a字段进行分组,再 以b字段进行排序,对数据进行查询。

例如:lead(field, num, defaultvalue) field需要查找的字段,num往后查找的num行的数据,defaultvalue没有符合条件的默认值。

获取当前记录的id,以及下一条记录的id

select t.id id,lead(t.id,1,null) over(order by t.id)next_record_id,t.cphm from yx_test t;
oracle中over()分析函数_day1
获取当前记录的id,以及上一条记录的id

select t.id id ,lag(t.id, 1, null) over (order by t.id)next_record_id, t.cphm from yx_test t ;

oracle中over()分析函数_day1
加上partition by 进行分块

select t.id id,lead(t.id, 1, null) over (partition by t.cphm order by t.id) next_record_id,t.cphm from yx_test t order by t.id asc;
oracle中over()分析函数_day1