四个排名函数(row_number、rank、dense_rank和ntile)的比较_.docVIP

四个排名函数(row_number、rank、dense_rank和ntile)的比较_.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
四个排名函数(row_number、rank、dense_rank和ntile)的比较_

?? 排名函数是SQL Server2005新加的功能。在SQL Server2005中有如下四个排名函数: 排名函数为分区中的每一行返回一个排名值。根据所用函数的不同,某些行可能与其他行接收到相同的值。排名函数具有不确定性。 1.?row_number 2.?rank 3.?dense_rank 4.?ntile??? ??? 下面分别介绍一下这四个排名函数的功能及用法。在介绍之前假设有一个t_table表,表结构与表中的数据如图1所示: 图1 其中field1字段的类型是int,field2字段的类型是varchar 一、row_number ??? row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。row_number函数的用法如下面的SQL语句所示: ? select?row_number()?over(order?by?field1)?as?row_number,*?from?t_table ??? 上面的SQL语句的查询结果如图2所示。 图2 ??? 其中row_number列是由row_number函数生成的序号列。在使用row_number函数是要使用over子句选择对某一列进行排序,然后才能生成序号。 ??? 实际上,row_number函数生成序号的基本原理是先使用over子句中的排序语句对记录进行排序,然后按着这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同,如下面的SQL语句所示: ? select?row_number()?over(order?by?field2?desc)?as?row_number,*?from?t_table?order?by?field1?desc ??? 上面的SQL语句的查询结果如图3所示。 图3 ??? 我们可以使用row_number函数来实现查询表中指定范围的记录,一般将其应用到Web应用程序的分页功能上。下面的SQL语句可以查询t_table表中第2条和第3条记录: ? with?t_rowtable as ( ????select?row_number()?over(order?by?field1)?as?row_number,*?from?t_table ) select?*?from?t_rowtable?where?row_number1?and?row_number??4?order?by?field1 ??? 上面的SQL语句的查询结果如图4所示。 图4 ??? 上面的SQL语句使用了CTE,关于CTE的介绍将读者参阅 HYPERLINK /nokiaguy/archive/2009/nokiaguy/archive/2009/01/31/252787.html 《SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL》。 ??? 另外要注意的是,如果将row_number函数用于分页处理,over子句中的order by 与排序记录的order by 应相同,否则生成的序号可能不是有续的。 ??? 当然,不使用row_number函数也可以实现查询指定范围的记录,就是比较麻烦。一般的方法是使用颠倒Top来实现,例如,查询t_table表中第2条和第3条记录,可以先查出前3条记录,然后将查询出来的这三条记录按倒序排序,再取前2条记录,最后再将查出来的这2条记录再按倒序排序,就是最终结果。SQL语句如下: ? ? select?*?from?(select?top?2?*?from(?select?top?3?*?from?t_table?order?by?field1)?a?order?by?field1?desc)?b?order?by?field1 ??? 上面的SQL语句查询出来的结果如图5所示。 图5 ??? 这个查询结果除了没有序号列row_number,其他的与图4所示的查询结果完全一样。 二、rank ??? rank函数考虑到了over子句中排序字段值相同的情况,为了更容易说明问题,在t_table表中再加一条记录,如图6所示。 图6 ??? 在图6所示的记录中后三条记录的field1字段值是相同的。如果使用rank函数来生成序号,这3条记录的序号是相同的,而第4条记录会根据当前的记录数生成序号,后面的记录依此类推,也就是说,在这个例子中,第4条记录的序号是4,而不是2。rank函数的使用方法与row_number函数完全相同,SQL语句如下: ? select?rank()?over(order?by?field1),*?from?t_t

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档