需求场景:在一个学校的学生学科分值管理中,会遇到给每个学生的学科分值排名以及对每个选手的学科平均分进行排名的问题。
第一步:创建数据库及表格
这里我们采用Sql Server数据库管理系统,创建一个数据库gCodeTop,然后再创建一张存放学生学科分值的表StudentMark,其设计结构如下:
上述设计界面中的字段解释:
ID 字段代表主键,字符类型
StuName 字段代表学生名称 ,字符类型
SqlServer 字段代表SqlServer成绩,小数类型,保留2位小数
Math 字段代表数学成绩,小数类型,保留2位小数
Gym 字段代表体育成绩,小数类型,保留2位小数
第二步:填充相关测试数据
打开上述设计好的表格StudentMark表,填充一些测试数据,与下图所示类似即可:
第三步:每门课的排名查询代码编写
参考代码如下:
上述代码解释:
里面使用了Sql Server特色函数:排名函数Dense_Rank() (注:这是稠排名函数,如果打算使用普通排名函数,可更换成 Rank())。在使用排名函数时候,要先对分值数据进行从大到小的排序,然后才能完成排名即名次的计算,所以,里面有一个排序代码:over(order by ……desc)。最终查询结果多了3列数据,如上图的红色框所示,即每门课的排名次序数据。
第四步:每个选手的平均分排名代码的编写
每个选手的的平均分,也就是(SqlServer+Math+Gym)/3,要完成对它们进行名次计算,可以在上述代码的基础上,再添加如下红色框代码,即可搞定。最终的查询结果又多了2列数据。
格码大叔小结:排名计算,是一个常见的需求。通过Sql Server特色的的排名函数即可完成。请记住稠排名Dense_Rank,名次没有间隔。普通排名Rank,名次可能有间隔。在排名前,一定要通过over(Order by...)完成相关排名数据的排序。Desc代表从大倒小的排序。