Chinaunix首页 | 论坛 | 博客
  • 博客访问: 560089
  • 博文数量: 155
  • 博客积分: 4015
  • 博客等级: 上校
  • 技术积分: 1625
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-18 16:55
文章分类

全部博文(155)

文章存档

2009年(20)

2008年(39)

2007年(66)

2006年(29)

2005年(1)

我的朋友

分类: Oracle

2008-10-18 10:51:10

   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
阅读(1023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~