Oracle 的開窗函式 rank,dense_rank,row_number
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 |
注意分組函式和開窗函式針對資料在維度上的變化,分組函式使個體資料小時。開窗函式保留個體。