Oracle 的开窗函数 rank,dense_rank,row_number

时间:2021-09-11 03:03:37

1、开窗函数和分组函数的区别

分组函数是指按照某列或者某些列分组后进行某种计算,比如计数,求和等聚合函数进行计算。

开窗函数是指基于某列或某些列让数据有序,数据行数和原始数据数相同,依然能曾现个体数据的原貌。

事例数据

create table student_scores(
stu_id varchar2(10),--学号
stu_name varchar2(20),--姓名
course varchar2(5),--课程
score number(5,2),--分数
constraint pk_stuid_course primary key (stu_id,course)
);

insert into student_scores(stu_id,stu_name,course,score) values('10001','周杰伦','语文','85');
insert into student_scores(stu_id,stu_name,course,score) values('10001','周杰伦','数学','96');
insert into student_scores(stu_id,stu_name,course,score) values('10001','周杰伦','英语','67');
insert into student_scores(stu_id,stu_name,course,score) values('10002','谢霆锋','语文','71');
insert into student_scores(stu_id,stu_name,course,score) values('10002','谢霆锋','数学','97');
insert into student_scores(stu_id,stu_name,course,score) values('10002','谢霆锋','英语','100');
insert into student_scores(stu_id,stu_name,course,score) values('10003','苏有朋','语文','79');
insert into student_scores(stu_id,stu_name,course,score) values('10003','苏有朋','数学','65');
insert into student_scores(stu_id,stu_name,course,score) values('10003','苏有朋','英语','80');
insert into student_scores(stu_id,stu_name,course,score) values('10004','刘德华','语文','41');
insert into student_scores(stu_id,stu_name,course,score) values('10004','刘德华','数学','61');
insert into student_scores(stu_id,stu_name,course,score) values('10004','刘德华','英语','62');
insert into student_scores(stu_id,stu_name,course,score) values('10005','小龙女','语文','94');
insert into student_scores(stu_id,stu_name,course,score) values('10005','小龙女','数学','95');
insert into student_scores(stu_id,stu_name,course,score) values('10005','小龙女','英语','96');

2、分组函数:group by

按照课程进行分组,可以进行如下计算

select course,count(*) cou,avg(score) avgs,max(score) maxs,min(score) mins
from student_scores
group by course;

COURSE

COU

AVGS

MAXS

MINS

1

数学

5

82.8

97

61

2

语文

5

74

94

41

3

英语

5

81

100

62

3、开窗函数:rank() ,dense_rank(),row_number()

每个学科按照分数倒序排名

select stu_id,stu_name,course,score,rank() over(partition by course order by score desc) rank

from student_scores;

STU_ID

STU_NAME

COURSE

SCORE

RANK

1

10002

谢霆锋

数学

97.00

1

2

10001

周杰伦

数学

96.00

2

3

10005

小龙女

数学

95.00

3

4

10003

苏有朋

数学

65.00

4

5

10004

刘德华

数学

61.00

5

6

10002

谢霆锋

英语

100.00

1

7

10005

小龙女

英语

96.00

2

8

10003

苏有朋

英语

80.00

3

9

10001

周杰伦

英语

67.00

4

10

10004

刘德华

英语

62.00

5

11

10005

小龙女

语文

94.00

1

12

10001

周杰伦

语文

85.00

2

13

10003

苏有朋

语文

79.00

3

14

10002

谢霆锋

语文

71.00

4

15

10004

刘德华

语文

41.00

5

注意分组函数和开窗函数针对数据在维度上的变化,分组函数使个体数据小时。开窗函数保留个体。