在sql server中,我们常用的排名函数有三种,分别是 row_number、rank、dense_rank在这三种排名函数中,都要与over子句连用,而下面我们就来说一下它们的用法和差异。
1.row_number
row_number函数是我平时运用最多的排名函数,这个函数的功能是为查询出来的每一行记录生成一个序号(序号连续的排名)。row_number函数的用法如下
SELECT row_number()over(ORDER BY 年龄)AS num,* FROM Student_Two
其中num列是由row_number函数生成的序号列。在使用row_number函数是要使用over子句选择对某一列进行排序,然后才能生成序号。
实际上,row_number函数生成序号的基本原理是先使用over子句中的排序语句对记录进行排序,然后按着这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同,如下面的SQL语句所示:
SELECT row_number()over(ORDER BY 年龄)AS num,* FROM Student_Two ORDER BY 学生编号
当然了我平时使用row_number最多的时候是用它来解决分页查询和分区排序或者查询每个区域内的最大值最小值,代码如下:
--1.每页是条数据,查询第二页
SELECT top 10 * FROM(
SELECT row_number()over(ORDER BY 年龄)AS num,* FROM Student_Two
) tt WHERE tt.num<(10*2)AND tt.num>(10*1)
--2.分区查询,查询出各个班级中年龄最大的学生信息
SELECT * FROM(
SELECT row_number()over(partition by 所属班级 ORDER BY 年龄)AS num,* FROM Student_Two
)tt WHERE tt.num=1
2.rank
rank函数在over子句中排序字段值相同的情况下,排名是相同的,而且排名是不连续的,比如下面的例子:
SELECT rank()over(ORDER BY 年龄)AS num,* FROM Student_Two WHERE 学生编号<15
3.dense_rank
dense_rank函数的功能与rank函数类似(over子句中排序字段值相同时排名相同),只是在生成序号时是连续的,而rank函数生成的序号有可能不连续,如:
SELECT dense_rank()over(ORDER BY 年龄)AS num,* FROM Student_Two WHERE 学生编号<15
好了这就是我在开发中对于排名函数的认知与运用了,希望能够帮到大家,如果有什么错误或者是更好的建议,也希望大家多多指正与分享,谢谢大家!