设为首页 收藏本站
查看: 1012|回复: 0

[经验分享] SQL Server 2005中的ROW_NUMBER和RANK

[复制链接]

尚未签到

发表于 2018-10-17 10:21:05 | 显示全部楼层 |阅读模式
下面介绍两个SQL Server 2005 中的新东东:  ROW_NUMBER
  返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
  语法:
  ROW_NUMBER ( )     OVER ( [  ]  )
  备注:
  ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
  参数:
  
  将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
  
  确定将 ROW_NUMBER 值分配给分区中的行的顺序。
  返回类型:
  bigint
  示例:
  以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。
USE AdventureWorksGOSELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCodeFROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactIDJOIN Person.Address a ON a.AddressID = c.ContactIDWHERE TerritoryID IS NOT NULL AND SalesYTD  0  以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。
USE AdventureWorks;GOWITH OrderedOrders AS  (
SELECT SalesOrderID, OrderDate,  ROW_NUMBER()
OVER (order by OrderDate)as RowNumberFROM Sales.SalesOrderHeader ) SELECT * FROM OrderedOrders WHERE RowNumber between 50 and 60;  RANK
  返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。
  语法:
  RANK ( )    OVER ( [ < partition_by_clause > ] < order_by_clause > )
  备注:
  如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。例如,如果两位顶尖销售员具有同样的 SalesYTD 值,他们将并列第一。由于已有两行排名在前,所以具有下一个最大 SalesYTD 的销售人员将排名第三。因此,RANK 函数并不总返回连续整数。
用于整个查询的排序顺序决定了行在结果集中的显示顺序。这也隐含了行在每个分区中的排名。  参数:
  < partition_by_clause >
  将 FROM 子句生成的结果集划分为要应用 RANK 函数的分区。
  < order_by_clause >
  确定将 RANK 值应用于分区中的行时所基于的顺序。
  返回类型:
  bigint
  示例:
  以下示例按照数量对清单中的产品进行了排名。行集按 LocationID 分区,按 Quantity 排序。
USE AdventureWorks;GOSELECT i.ProductID, p.Name, i.LocationID, i.Quantity, RANK() OVER (PARTITION BY i.LocationID order by i.Quantity) as RANKFROM Production.ProductInventory i JOIN Production.Product p ON i.ProductID = p.ProductIDORDER BY p.NameGO下面是和朋友讨论的一个小例子,不知道对不对,大家指教啊:  一个记录集{1,1,1,4,4,4,7,7,7,7,7,7,7,7,7}
  当用 rank between 1 and 10 过滤 {1,1,1,4,4,4,7,7,7,7,7,7,7,7,7}时,就会得到超过十条的记录
  用rownumber between 1 and 10得到的是{1,1,1,4,4,4,7,7,7,7}
  也就是说:
  用rank就是同样的记录看作是进行一个排名,得到的有可能大于10条
  例如:比赛中第一名1个,第二名1个,第三名3个,下一个人就不是第四名而是第六名
人员名次A1B2C3D3E3F6G7H8I9J10  如果用rank就是从这个记录集中选出结果,例如前4名我们得到的是如下结果:
人员名次A1B2C3D3E3F6  而rownumber不管重复仅得到4条而已,结果如下:
人员名次A1B2C3D3

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-622666-1-1.html 上篇帖子: PB8.0如何连SQL SERVER2008? 下篇帖子: SQL Server 2005 五个动态管理对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表