Sql Server2005中新增加了4个排名函数:ROW_NUMBER, RANK, DENSE_RANK, NTILE;大家一定已经对ROW_NUMBER非常熟悉了,所以我从最后一个NTILE开始分析。
NTILE在msdn中的解释是:将有序分区中的行分发到指定数目的组中。各个组有编号,编号从一开始。对于每一个行,NTILE 将返回此行所属的组的编号。不知道大家是不是一下子就能看懂这个解释,反正我是结合解释自己写了例子才弄明白的。
准备脚本,我们创建一个简单的3列表,三列分别是id,categoryId,和name,如下:
|
查询语句如下:
|
我们给NTITL传的参数是3,即表示每一区将分成三组,然后OVER中表达式指定要根据categoryId来分割分组,并要按照categoryId排序。上面的表达式执行结果如下:
![]() |
| 图1(原图经51CTO.com修改) |
(如需查看原图请点击:图一原图)
图一说明:根据题中给出条件得出:结果集中的所有行都将被按照categoryId分隔成区,每一区都被分成3组(如上图)。
categoryId为1的两行:id=1行被分配到组1,id=4行被分配到组2,第一分区此时已分配完毕。
categoryId为2的四行:id=7,id=8行被分配到组1,id=9行被分配到组2,id=3行被分配到组3,第二分区已分配完毕。
categoryId为3的两行:id=5行被分配到组1,id=6行被分配到组2,第三分区分配完毕。
categoryId为4的一行:id=2行被分配到组1,第四分区分配完毕。
至此结果集中的所有行均已被分配。各组成员如上图所示。
下面看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(通用表表达式)使用,如下例子
|
【相关文章】
|
||||
| · 视频访谈:网管员如何踏.. · 首届中国IT工程师生态.. · 华为路由器配置 · 全面解析35岁技术人的.. · 企业数据恢复指南 · 龙芯要做中国的“奔腾” · 2008年上半年全国软考.. · 交换机故障解决指南 |
· Vista SP1对决XP SP3 · LAMP技术精解 · 微软出价446亿美元收购.. · 网络故障排除宝典 · AIX操作系统管理应用(.. · 华为员工自杀频频拷问.. · 三层交换技术专题 · ARP攻击防范与解决方案 |
|||
|
||||
| · SQL Server 2008/2005.. · SOA 面向服务架构 · SQL Server 2008/2005.. · iSCSI应用与发展 · RAID——磁盘阵列基础 · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 |
· Apache技术专题 · 国际文档格式标准开战 · 路由器设置与口令恢复 · 打造安全服务器 · PHP开发应用手册 · SOA 面向服务架构 · 企业数据恢复指南 · ADSL应用面面俱到 |
|||
|
||||
| · iSCSI应用与发展 · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · iSCSI应用与发展 · 三层交换技术专题 · Apache技术专题 |
· 企业数据恢复指南 · RAID——磁盘阵列基础 · 路由器设置与口令恢复 · SOA 面向服务架构 · ADSL应用面面俱到 · ADSL应用面面俱到 · 反垃圾邮件技术应用 · 访问控制列表(ACL)介绍 |
|||