- 关 键 词:
- sql server
Sql Server2005中新增加了4个排名函数:ROW_NUMBER, RANK, DENSE_RANK, NTILE;大家一定已经对ROW_NUMBER非常熟悉了,所以我从最后一个NTILE开始分析。
NTILE在msdn中的解释是:将有序分区中的行分发到指定数目的组中。各个组有编号,编号从一开始。对于每一个行,NTILE 将返回此行所属的组的编号。不知道大家是不是一下子就能看懂这个解释,反正我是结合解释自己写了例子才弄明白的。
准备脚本,我们创建一个简单的3列表,三列分别是id,categoryId,和name,如下:
|
查询语句如下:
|
我们给NTITL传的参数是3,即表示三行作为一组,然后OVER中表达式指定要根据categoryId来分割分组,并要按照categoryId排序。上面的表达式执行结果如下:
下面看RANK和DENSE_RANK这对兄弟函数,这对函数要比NTITL容易理解一些。MSDN对RANK的解释:返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。MSDN上对DENSE_RANK的解释是:返回结果集分区中行的排名,在排名中没有任何间断。行的排名等于所讨论行之前的所有排名数加一。下面我用一个例子来说明一下,用结果说明他们的差别:
|
分别执行下面两个select脚本,可以得到如下的结果

图1
可以看到1班同学的排名依次是1,1,3,4有了并列第一之后第二名的排序就是3了。
如下是DENSE_RANK的执行结果:

图1
可以看到排名依次是1,1,2,3 … 当出现两个并列第一之后,第二名的排名是2,而非RANK中的3.所以我们在给学生成绩排名时可以用DENSE_RANK而不是RANK。
最后要介绍的是ROW_NUMBER这个函数为我们分页提供了便利。我们可以结合CTE(通用表表达式)使用,如下例子
|
相关专题
- SQL Server 数据处理专题 (1915篇文章)
- SQL Server 索引和查询专题 (3414篇文章)
- SQL Server (1872篇文章)
- 数据库体系架构 (533篇文章)
- SQL Server (1874篇文章)
- 在Win Server 2008运行 SQL Server 2008 (43次浏览)
- SQL Server 2008企业版中的数据库加密 (26次浏览)
- SQL Server 2008数据库中的新数据类型 (21次浏览)
- 浅析SQL Server 2008的Change Data Capture功 (21次浏览)
- 轻松了解“SQL Server 2008”的报表服务 (21次浏览)
- 如何在SQL Server 2008中订阅策略组 (15次浏览)
- SQL Server 2008在数据仓库方面的一些优点 (11次浏览)
- Micorsoft SQL Server 2008数据仓库平台 (5次浏览)
- 详解SQL Server 2008中的联机事务处理 (5次浏览)
- 深入了解SQL Server 2008 商业智能平台 (4次浏览)




