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 | select ID, rank() over(order by(GPA) dese ) as s_rank |
注意这里没有定义输出中的元组顺序,所以元组可能不按名次排序。需要使用一个附加的order by
子句得到排序的元组,如下所示:
1 | select ID,rank() over(order by( GPA) desc) as s_rank |
省略后面再过来看.
5.5.2 分窗
省略.