Oracle中聚合函数RANK和DENSE_RANK的使用.
期末考试成绩表(T_QMKSCJ)
年度 班级号 科目号 学生学号 成绩
2000 001 0001 00001001 88
2000 001 0001 00001002 99
2000 001 0001 00001003 89
2000 001 0002 00001001 87
2000 001 0002 00001002 60
2000 001 0002 00001003 70
2000 002 0001 00002001 88
2000 002 0001 00002002 99
2000 002 0001 00002003 89
2000 002 0002 00002001 87
2000 002 0002 00002002 60
2000 002 0002 00002003 70
2001 001 0001 01001001 88
2001 001 0001 01001002 99
2001 001 0001 01001003 89
2001 001 0002 01001001 87
2001 001 0002 01001002 60
2001 001 0002 01001003 70
2001 002 0001 01002001 88
2001 002 0001 01002002 99
2001 002 0001 01002003 89
2001 002 0002 01002001 87
2001 002 0002 01002002 60
2001 002 0002 01002003 70
2001 003 0003 01003001 87
2001 003 0003 01003002 60
2001 003 0003 01003003 70
1)选出各年度各班级各科目第一名的学生的信息(年度,班级号,科目号,成绩,学号)
select T.年度, T.班级号, T.科目号, T.成绩,T.学生学号,
dense_rank() over (partition by T.年度, T.班级号, T.科目号 order by T.成绩 desc) T.排名
from T_QMKSCJ T
where T.排名 = '1'
2)选出各年度各班级各科目第一名的学生的信息(年度,班级名,科目名,成绩,学号,学生姓名)
select T.年度, T.班级名, T.科目名, T.成绩,T.学生学号,T.学生姓名,
dense_rank() over (partition by T.年度, T.班级号, T.科目号 order by T.成绩 desc) T.排名
from
(select
A.年度, A.班级号, A.科目号, A.成绩,A.学生学号,B.班级名, C.学生姓名, D.科目名
from
T_QMKSCJ A,
T_班级 B,
T_学生 C,
T_科目 D
where A.班级号 = B.班级号
and A.学生学号 = C.学生学号
and A.科目号 = D.科目号
) T
where T.排名 = '1'
3)某年度某班级的某学生的某门科目的考试成绩在其班级排第几?
年度 班级号 科目号 学生学号 成绩
2001 002 0001 01002003 89
SELECT
RANK(2001,002,0001,89) WITHIN GROUP
(ORDER BY T.年度, T.班级号, T.科目号, T.成绩 DESC) T.排名
FROM T_QMKSCJ T
注意:
Rank()里的参数必须为常数,或常值表达式,里面参数的个数,类型也要和order by后字段的类型相对应.