Rank,Oracle提供的一个用来分组排序的函数。
考虑以下基表,该表格是考试成绩表(SC):
我想知道每个同学的特长科目是什么,即每个同学在所选科目中哪一个科目排第一(成绩最好)。
经分析我们知道这个SQL查询其实是需要实现以下语义:
1,按学生姓名来分组;
2,对于每个学生的所有科目成绩进行排序;
3,取出排序后的最大值所在的记录;
这正好符合Rank函数所能完成的功能,我们写出以下SQL:
SELECT RANK () OVER (PARTITION BY Name ORDER BY Score DESC) AS "rank", Name, Course,Score FROM sc
|
该SQL查询出的结果为:
可以看到Rank函数按姓名分组(Partition by Name),然后再按成绩进行排序(Order by Score)。
得到这个结果后,我们可以再对这个结果进行筛选,即可得到我们想要的结果。
SELECT * FROM (SELECT RANK () OVER (PARTITION BY Name ORDER BY Score DESC) AS rk,
Name, Course, Score FROM sc) WHERE rk = 1
|
Dense_Rank:
我们留意的下SC表,Bily的English成绩和Match的成绩相等。也就是说在对Bily的成绩进行排序时,Bily的Rank为2的数据有两笔,那Bily剩下的一门History的排名应是第三呢,还是第四呢。这个问可以抽象为:
Bily的成绩排名结果是[1, 2, 2, 4]呢? 还是[1, 2, 2, 3]呢?
答案是:
如果你用Rank,则是[1, 2, 2, 4],这你从上面的查询结果中可以看出来。
若你用的是Dense_Rank则排名结果为[1, 2, 2, 3]。
Jerry.Chou
10'16'08
阅读(1048) | 评论(0) | 转发(0) |