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

[经验分享] SQL SERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER

[复制链接]

尚未签到

发表于 2018-10-20 12:27:19 | 显示全部楼层 |阅读模式

前言
  本文意于用实例数据帮助理解SQL SERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER。
准备工作
创建测试表:
  ?
12345create table test(id int identity(1,1) primary key,testid int,name varchar(100)) 插入测试数据:
  ?
1234567insert into test(testid,name)select 1,'LeeWhoee University'insert into test(testid,name)select 1,'LeeWhoee University'insert into test(testid,name)select 1,'LeeWhoee University'insert into test(testid,name)select 2,'LeeWhoee University'insert into test(testid,name)select 3,'排名函数'insert into test(testid,name)select 4,'排名函数'insert into test(testid,name)select 4,'排名函数'用一个SQL语句来查看各个函数的使用:
  ?
1234567select id,testid,ROW_NUMBER() over( order by testid) as rownum,RANK() over(order by testid) as ranknum,DENSE_RANK() over(order by testid) as denseranknum,Ntile(4) over ( order by testid) as ntilenumfrom testorder by testid  下面是运行结果:
  id testid rownum ranknum denseranknum ntilenum
  1 1 1 1 1 1
  2 1 2 1 1 1
  3 1 3 1 1 2
  4 2 4 4 2 2
  5 3 5 5 3 3
  6 4 6 6 4 3
  7 4 7 6 4 4
ROW_NUMBER() over( order by testid)
  按testid升序排列为每一个testid生成与之对应的一个序列数字,这些数字是从1开始由小到大的不间断数字。每个序列数字是唯一的。
RANK() over(order by testid)
  按testid升序排列为每一个testid生成与之对应的一个排名数字,这些数字是从1开始由小到大排序(可能间断)。相同的testid生成的排名数字也相同,但是下一排名数字不是由之前的排名数字加1计算出的,而是排名总数即行数。
DENSE_RANK() over(order by testid)
  按testid升序排列为每一个testid生成与之对应的一个排名数字,这些数字是从1开始由小到大排序的不间断数字(可能重复)。相同的testid生成的排名数字也相同,但是下一排名数字是由之前的排名数字加1计算出,而不是排名总数或行数。
Ntile(4) over ( order by testid)
  按testid升序排列并将所有testid平均分成4组(最后一组testid总数可能少于其它组),然后为每一个testid生成与之对应的一个所属组编号。组编号是从1开始由小到大的不间断数字。
partition by
  下面看一个带partition by的SQL语句来查看各个函数的使用:
  ?
1234567select id,testid,name,ROW_NUMBER() over(partition by name order by testid) as rownum,RANK() over(partition by name order by testid) as ranknum,DENSE_RANK() over(partition by name order by testid) as denseranknum,Ntile(2) over (partition by name order by testid) as ntilenumfrom testorder by name  运行结果:
  id testid name rownum ranknum denseranknum ntilenum
  1 1 LeeWhoee University 1 1 1 1
  2 1 LeeWhoee University 2 1 1 1
  3 1 LeeWhoee University 3 1 1 2
  4 2 LeeWhoee University 4 4 2 2
  5 3 排名函数 1 1 1 1
  6 4 排名函数 2 2 2 1
  7 4 排名函数 3 2 2 2
ROW_NUMBER() over(partition by name order by testid)
  按name先进行数据分区,然后对每一区进行正常的ROW_NUMBER()计算。
RANK() over(partition by name order by testid)
  按name先进行数据分区,然后对每一区进行正常的RANK()计算。
DENSE_RANK() over(partition by name order by testid)
  按name先进行数据分区,然后对每一区进行正常的DENSE_RANK()计算。
Ntile(2) over (partition by name order by testid)
  按name先进行数据分区,然后对每一区进行正常的Ntile()计算。
  为了便于区分数据,在这里进行了NTILE(2)而不是NTILE(4)。


运维网声明 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-624063-1-1.html 上篇帖子: 如何用SQL对MaxCompute数据进行修改和删除 下篇帖子: SQL注入点搜索关键字
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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