IT技术网www.itjs.cn

当前位置:首页 > 数据库 > SQl Server > Sql Server2005对t-sql的增强之排名函数

Sql Server2005对t-sql的增强之排名函数

发布时间:2015-11-21 00:00 来源:未知

Sql Server2005中新增加了4个排名函数:ROW_NUMBER, RANK, DENSE_RANK, NTILE;大家一定已经对ROW_NUMBER非常熟悉了,所以我从最后一个NTILE开始分析。

NTILE在msdn中的解释是:将有序分区中的行分发到指定数目的组中。各个组有编号,编号从一开始。对于每一个行,NTILE 将返回此行所属的组的编号。不知道大家是不是一下子就能看懂这个解释,反正我是结合解释自己写了例子才弄明白的。

准备脚本,我们创建一个简单的3列表,三列分别是id,categoryId,和name,如下:

GO

分别执行下面两个select脚本,可以得到如下的结果

Sql Server2005对t-sql的增强之排名函数
图1


可以看到1班同学的排名依次是1,1,3,4有了并列第一之后第二名的排序就是3了。

如下是DENSE_RANK的执行结果:

Sql Server2005对t-sql的增强之排名函数
图1

可以看到排名依次是1,1,2,3 … 当出现两个并列第一之后,第二名的排名是2,而非RANK中的3.所以我们在给学生成绩排名时可以用DENSE_RANK而不是RANK。

最后要介绍的是ROW_NUMBER这个函数为我们分页提供了便利。我们可以结合CTE(通用表表达式)使用,如下例子

WITH CTE_rn (student_id,class_no,grade,rn) AS(
SELECT student_id,class_no,grade,rn = ROW_NUMBER() OVER(ORDER BY student_id ASC)
FROM student_class_grade
WHERE 0=0 --可以在此处加一些过滤条件,这样下面的分页的sql中就都不需要加条件了
)
--获得第-10条的数据
SELECT student_id,class_no,grade FROM CTE_rn WHERE rn BETWEEN 6 AND 10;
SELECT totalCn = COUNT(*) FROM student_class_grade WHERE 0=0