5.5 高级聚集特性

5.5 高级聚集特性

此前我们已经看到,SQL对聚集的支持是十分强大的,可以很便捷地完成一般性的任务。然而,有些任务很难用基本的聚集特性来高效实现。在本节中,我们将研究为完成这些任务而向SQL中引人的一些特性。

5.5.1 排名

从一个大的集合中找出某值的位置是一个常见的操作。
例如,我们可能希望基于学生的平均绩点(GPA)赋予他们在班级中的名次:GPA最高的学生排名第1,次高分学生排名第2,等等。

另一种相关的查询类型是找某个值在一个(允许重复值的)集合中所处的百分点,比如排在后1/3、中间1/3或是前1/3。虽然这样的查询可用构造SQL语句来完成,但表达困难且计算效率低。编程人员通常借助于将部分代码写在SQL中,另一部分代码写在程序设计语言中的方式去实现它。

我们在这里讨论SQL中如何对这类查询进行直接表达。

在我们的大学例子中,关系takes存储了每个学生在所选的每一门课程上所获得的成绩。为了演示排名,我们假设有一个视图student_grades(ID,GPA),它给出了每个学生的平均绩点。
排名是用order by说明来实现的。下面的查询给出了每个学生的名次。

1
2
select ID, rank() over(order by(GPA) dese ) as s_rank
from student_grades;

注意这里没有定义输出中的元组顺序,所以元组可能不按名次排序。需要使用一个附加的order by子句得到排序的元组,如下所示:

1
2
3
select ID,rank() over(order by( GPA) desc) as s_rank
from student_grades
order by s_rank;

省略后面再过来看.

5.5.2 分窗

省略.