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

[经验分享] SQL Server排名函数与排名开窗函数

[复制链接]

尚未签到

发表于 2017-12-14 13:32:26 | 显示全部楼层 |阅读模式
  什么是排名函数?说实话我也不甚清楚,我知道 order by 是排序用的,那么什么又是排名函数呢?
  接下来看几个示例就明白了。
  首先建立一个表,随便插入一些数据。
DSC0000.png

  ROW_NUMBER 函数:直接排序,ROW_NUMBER函数是以上升进行直接排序,并且以连续的顺序给每一行数据一个唯一的序号。(即排名连续)
  

  
select *,
  
'第'+convert(varchar,ROW_NUMBER() over(order by U_Pwd))+'名' RowNum
  
from UserInfo
  

DSC0001.png

  RANK 函数:并列排序,在 order by 子句中指定的列,如果返回一行数据与另一行具有相同的值,rank函数将给这些行赋予相同的排名数值。
  在排名的过程中,保持一个内部计数值,当值有所改变时,排名序号将有一个跳跃。(即排名不连续)
  

  
select *,
  
'第 '+convert(varchar,rank() over(order by U_Pwd))+' 名' RowNum
  
from UserInfo
  

DSC0002.png

  可以明确的看到有4行数据并列第2名,然后直接就是第6名,这是因为 order by 子句中指定的列 U_Pwd 的值相同。
  DENSE_RANK 函数:并列排序,这一点与 RANK() 函数类似,order by 子句指定的列的值相同,排名数值相同,但是后面是连续的。(即排名连续)
  

  
select *,
  
'第 '+convert(varchar,DENSE_RANK() over(order by U_Pwd))+' 名' RowNum
  
from UserInfo
  

DSC0003.png

  可以看到即使有4行数据并列第2名,但是接下来依然是第3名。
  NTILE 函数:将查询的结果分发到指定数量的组中。 各个组有编号,编号从1开始。 对于每一行,NTILE 将返回此行所属的组的编号。
  组中的行数计算方式为 total_num_rows(结果集的总行数) / num_groups(指定的组数)。
  如果有余数 n,则前面 n 个组获得一个附加行。因此,可能不会所有组都获得相等数量的行,但是组大小最大只可能相差一行。
  例如,如果总行数是 53,组数是 5,53 / 5 等于10余数是3,按上面个规则就是,每组分配10行,又因余数为3,所以前面3组每组附加一行。
  则前三个组每组包含 11 行,其余两个组每组包含 10 行。
  另一方面,如果总行数可被组数整除,则行数将在组之间平均分布。 例如,如果总行数为 50,有五个组,则每组将包含 10 行。
  

  
select *,
  
'第 '+convert(varchar,NTILE(3) over(order by U_Pwd))+' 组' RowNum
  
from UserInfo
  

DSC0004.png

  这个表中有10条数据,指定分为3组,10/3等于3余数1。
  PS:排名函数后面必须有 over() 子句。
  排名开窗函数:
  ROW_NUMBER、DENSE_RANK、RANK、NTILE属于排名函数,OVER()就是窗口函数。
  窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。
  开窗函数不需要使用GROUP BY就可以对数据进行分组,还可以同时返回基础行的列和聚合列。
  排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。
  ODER BY 指定排名开窗函数的顺序。在排名开窗函数中必须使用ORDER BY语句。
  PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。
  

  
select *,
  
'第'+convert(varchar,ROW_NUMBER() over(partition by U_Pwd order by U_Pwd))+'名' RowNum
  
from UserInfo
  

DSC0005.png

  因为 U_Pwd 这一列有4种不同的值,所以分为4组,然后 ROW_NUMBER 再在每一组中进行连续排序。
  

  
select *,
  
'第'+convert(varchar,rank() over(partition by U_Pwd order by U_Pwd))+'名' RowNum
  
from UserInfo
  

DSC0006.png

  因为 U_Pwd 这一列有4种不同的值,所以同样是分为4组,然后 RANK 再在每一组中进行排序,因为RANK是并列排序,所以全部都是第一名。下面换个字段排序试试看。
  

  
select *,
  
'第'+convert(varchar,rank() over(partition by U_Pwd order by U_Name))+'名' RowNum
  
from UserInfo
  

DSC0007.png

  

  
select *,
  
'第'+convert(varchar,DENSE_RANK() over(partition by U_Pwd order by U_Pwd))+'名' RowNum
  
from UserInfo
  

DSC0008.png

  因为 U_Pwd 这一列有4种不同的值,所以同样是分为4组,然后 DENSE_RANK 再在每一组中进行排序,因为DENSE_RANK也是并列排序,所以全部都是第一名。下面换个字段排序试试看。
  

  
select *,
  
'第'+convert(varchar,DENSE_RANK() over(partition by U_Pwd order by U_Name))+'名' RowNum
  
from UserInfo
  

DSC0009.png

  

  
select *,
  
'第'+convert(varchar,NTILE(3) over(partition by U_Pwd order by U_Pwd))+'名' RowNum
  
from UserInfo
  

DSC00010.png

  因为 U_Pwd 这一列有4种不同的值,所以同样是分为4组。第1组有1条数据,所以就1个区。第2组有4条数据,4/3等于1余数1,所以第2组分为3个区,又因余数为1,所以第1个区附加1行。第3组有3条数据,3/3等于1余数为0,所以第3组有3个区。第4组有2条数据,所以分为2个区。
  PS:在排序开窗函数中使用 PARTITION BY 子句需要放置在 ORDER BY子句之前。
  参考:
  http://www.cnblogs.com/jhxk/articles/2531595.html

运维网声明 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-424012-1-1.html 上篇帖子: SQL Server日志文件不断增长处理方法 下篇帖子: Sql Server 收缩日志文件原理及always on 下的实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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