我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Sql中排名函数有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Sql中排名函数有哪些

这篇文章主要介绍了Sql中排名函数有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别。我们新建一张Order表并添加一些初始数据方便我们查看效果。

表结构和初始数据Sql

附上表结构和初始数据图:

  Sql中排名函数有哪些

一、ROW_NUMBER

  row_number的用途的非常广泛,排序最好用他,一般可以用来实现web程序的分页,他会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。row_number用法实例:

select ROW_NUMBER() OVER(order by [SubTime] desc) as row_num,* from [Order]

  查询结果如下图所示:

  Sql中排名函数有哪些

  图中的row_num列就是row_number函数生成的序号列,其基本原理是先使用over子句中的排序语句对记录进行排序,然后按照这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同,如以下sql,over子句中根据SubTime降序排列,Sql语句中则按TotalPrice降序排列。

select ROW_NUMBER() OVER(order by [SubTime] desc) as row_num,* from [Order] order by [TotalPrice] desc

  查询结果如下图所示:

  Sql中排名函数有哪些

  利用row_number可以实现web程序的分页,我们来查询指定范围的表数据。例:根据订单提交时间倒序排列获取第三至第五条数据。

with orderSection as(    select ROW_NUMBER() OVER(order by [SubTime] desc) rownum,* from [Order])select * from [orderSection] where rownum between 3 and 5 order by [SubTime] desc

  查询结果如下图所示:

  Sql中排名函数有哪些

  注意:在使用row_number实现分页时需要特别注意一点,over子句中的order by 要与Sql排序记录中的order by 保持一致,否则得到的序号可能不是连续的。下面我们写一个例子来证实这一点,将上面Sql语句中的排序字段由SubTime改为TotalPrice。另外提一下,对于带有子查询和CTE的查询,子查询和CTE查询有序并不代表整个查询有序,除非显示指定了order by。

with orderSection as(    select ROW_NUMBER() OVER(order by [SubTime] desc) rownum,* from [Order])select * from [orderSection] where rownum between 3 and 5 order by [TotalPrice] desc

  查询结果如下图所示:

  Sql中排名函数有哪些

二、RANK

  rank函数用于返回结果集的分区内每行的排名, 行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。可能我描述的比较苍白,理解起来也比较吃力,我们直接上代码,rank函数的使用方法与row_number函数完全相同。

select RANK() OVER(order by [UserId]) as rank,* from [Order]

  查询结果如下图所示:

  Sql中排名函数有哪些

  由上图可以看出,rank函数在进行排名时,同一组的序号是一样的,而后面的则是根据当前的记录数依次类推,图中第一、二条记录的用户Id相同,所以他们的序号是一样的,第三条记录的序号则是3。  

三、DENSE_RANK

  dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第四名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。将上面的Sql语句改由dense_rank函数来实现。

select DENSE_RANK() OVER(order by [UserId]) as den_rank,* from [Order]

  查询结果如下图所示:

  Sql中排名函数有哪些

  图中第一、二条记录的用户Id相同,所以他们的序号是一样的,第三条记录的序号紧接上一个的序号,所以为2不为3,后面的依此类推。

四、NTILE

  ntile函数可以对序号进行分组处理,将有序分区中的行分发到指定数目的组中。 各个组有编号,编号从一开始。 对于每一个行,ntile 将返回此行所属的组的编号。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。ntile函数为每条记录生成的序号就是这条记录所有的数组元素的索引(从1开始)。也可以将每一个分配记录的数组元素称为“桶”。ntile函数有一个参数,用来指定桶数。下面的SQL语句使用ntile函数对Order表进行了装桶处理:

select NTILE(4) OVER(order by [SubTime] desc) as ntile,* from [Order]

  查询结果如下图所示:

  Sql中排名函数有哪些

  Order表的总记录数是6条,而上面的Sql语句ntile函数指定的组数是4,那么Sql Server2005是怎么来决定每一组应该分多少条记录呢?这里我们就需要了解ntile函数的分组依据(约定)。

  ntile函数的分组依据(约定):

  1、每组的记录数不能大于它上一组的记录数,即编号小的桶放的记录数不能小于编号大的桶。也就是说,第1组中的记录数只能大于等于第2组及以后各组中的记录数。

  2、所有组中的记录数要么都相同,要么从某一个记录较少的组(命名为X)开始后面所有组的记录数都与该组(X组)的记录数相同。也就是说,如果有个组,前三组的记录数都是9,而第四组的记录数是8,那么第五组和第六组的记录数也必须是8。

  这里对约定2进行详细说明一下,以便于更好的理解。

  首先系统会去检查能不能对所有满足条件的记录进行平均分组,若能则直接平均分配就完成分组了;若不能,则会先分出一个组,这个组分多少条记录呢?就是 (总记录数/总组数)+1 条,之所以分配 (总记录数/总组数)+1 条是因为当不能进行平均分组时,总记录数%总组数肯定是有余的,又因为分组约定1,所以先分出去的组需要+1条。

  分完之后系统会继续去比较余下的记录数和未分配的组数能不能进行平均分配,若能,则平均分配余下的记录;若不能,则再分出去一组,这个组的记录数也是(总记录数/总组数)+1条。

  然后系统继续去比较余下的记录数和未分配的组数能不能进行平均分配,若能,则平均分配余下的记录;若还是不能,则再分配出去一组,继续比较余下的......这样一直进行下去,直至分组完成。

  举个例子,将51条记录分配成5组,51%5==1不能平均分配,则先分出去一组(51/5)+1=11条记录,然后比较余下的 51-11=40 条记录能否平均分配给未分配的4组,能平均分配,则剩下的4组,每组各40/4=10 条记录,分配完成,分配结果为:11,10,10,10,10,晓菜鸟我开始就错误的以为他会分配成 11,11,11,11,7。

  根据上面的两个约定,可以得出如下的算法:

//mod表示取余,p表示取整.if(记录总数 mod 桶数==0)
{
  recordCount=记录总数 p 桶数;
  //将每桶的记录数都设为recordCount.}else{
  recordCount1=记录总数 p 桶数+1;
  int n=1;//n表示桶中记录数为recordCount1的最大桶数.  m=recordCount1*n;  while(((记录总数-m) mod (桶数- n)) !=0)
  {
    n++;
    m=recordCount1*n;
  }
  recordCount2=(记录总数-m) p (桶数-n);
  //将前n个桶的记录数设为recordCount1.  //将n+1个至后面所有桶的记录数设为recordCount2.}

 NTILE()函数算法实现代码

  根据上面的算法,如果总记录数为59,总组数为5,则 n=4 , recordCount1=12 , recordCount2=11,分组结果为 :12,12,12,12,11。

  如果总记录数为53,总组数为5,则 n=3 , recordCount1=11 , recordCount2=10,分组结果为:11,11,11,10,10。

  就拿上面的例子来说,总记录数为6,总组数为4,通过算法得到 n=2 , recordCount1=2 , recordCount2=1,分组结果为:2,2,1,1。

select ntile,COUNT([ID]) recordCount from (    select NTILE(4) OVER(order by [SubTime] desc) as ntile,* from [Order]) as tgroup by t.ntile

  运行Sql,分组结果如图:

  Sql中排名函数有哪些

  比对算法与Sql Server的分组结果是一致的,说明算法没错。:)

感谢你能够认真阅读完这篇文章,希望小编分享的“Sql中排名函数有哪些”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Sql中排名函数有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

sql中聚合函数有哪些

sql 中的聚合函数用于计算并返回一组行的单个值。常见的聚合函数包括:数值聚合函数:count()、sum()、avg()、min()、max()行集合聚合函数:group_concat()、first()、last()统计聚合函数:std
sql中聚合函数有哪些
2024-05-02

php中数组排序函数有哪些

php中数组排序函数有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的P
2023-06-14

php中有哪些数组排序函数

php中有哪些数组排序函数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Pe
2023-06-14

sql中row_number()函数的参数有哪些

在SQL中,ROW_NUMBER()函数用于为查询结果集中的行分配唯一的序号。ROW_NUMBER()函数通常在窗口函数(window function)中使用。该函数的语法如下:ROW_NUMBER() OVER (PARTITION
sql中row_number()函数的参数有哪些
2024-04-09

sql中的分析函数有哪些

sql 中的分析函数用于分析数据集合,提供聚合和累积结果,包括:聚合函数:计算数据集或分组数据的总和、计数、最大值、最小值和平均值。窗口函数:计算当前行与相关行(窗口)之间的值,如行号、排名和前导值。排序函数:对数据进行排序,如按部门或日期
sql中的分析函数有哪些
2024-05-09

sql中的替换函数有哪些

sql 提供了多种替换函数,用于替换字符串中的指定字符或字符序列:replace() 替换所有指定子字符串为新字符串。translate() 替换字符为指定字符序列中的对应字符。concat() 连接多个字符串为一个新字符串。substr(
sql中的替换函数有哪些
2024-05-15

sql中datepart函数的参数有哪些

在SQL中,DATEPART函数的参数可以是以下之一:year:提取日期中的年份部分quarter:提取日期中的季度部分month:提取日期中的月份部分dayofyear:提取日期中的年内第几天day:提取日期中的日部分week:
sql中datepart函数的参数有哪些
2024-04-09

sql中的lower函数有哪些功能

SQL中的LOWER函数是用于将字符串转换为小写的函数。LOWER函数通常用于在比较字符串时忽略大小写,或者在输出时统一字符串的格式。以下是LOWER函数的功能:将字符串转换为小写:LOWER函数会将输入字符串中的所有字符都转换为小写字母。
sql中的lower函数有哪些功能
2024-04-15

sql中datepart函数的功能有哪些

在SQL中,DATEPART函数用于提取日期或时间部分的值,常用的功能有:提取年份部分:DATEPART(year, date)提取月份部分:DATEPART(month, date)提取日部分:DATEPART(day, date)
sql中datepart函数的功能有哪些
2024-04-09

sql中ltrim函数的用途有哪些

ltrim函数是SQL中的一个字符串函数,用于删除字符串左边的空格或指定的字符。ltrim函数的主要用途包括:删除字符串左边的空格删除字符串左边的指定字符删除字符串左边的空格和指定字符通过使用ltrim函数,可以清除字符串左边的空格或
sql中ltrim函数的用途有哪些
2024-04-19

sql中coalesce函数的功能有哪些

在SQL中,COALESCE函数用于返回参数列表中的第一个非空表达式。其功能包括:返回参数列表中的第一个非空值。如果参数列表中的所有值都为空,则返回NULL。可以接受任意数量的参数。可以用作替代NVL函数,用于处理NULL值。总的来说
sql中coalesce函数的功能有哪些
2024-04-09

sql中lag函数的用途有哪些

在SQL中,LAG函数用于访问前一行的数据,以便与当前行的数据进行比较或计算。LAG函数的主要用途包括:计算当前行与前一行的差值或增长率检测当前行与前一行的变化或趋势计算时间差或时间间隔访问前一行的数据以进行进一步的计算或分析基于前
sql中lag函数的用途有哪些
2024-04-09

sql中lead函数的用途有哪些

获取当前行之后的指定行数的值返回当前行之后的下一行的指定列值可以用于计算当前行与下一行之间的差值在排序后的结果集中,可以获取当前行之后的行的指定值可以用于获取当前行之后的行的行号可以用于查找当前行之后的行的某个特定值
sql中lead函数的用途有哪些
2024-04-09

sql中count()函数的功能有哪些

在SQL中,COUNT()函数是一个聚合函数,主要用于计算表中行的数量。它可以有不同的使用方式,根据其参数的不同,功能也会有所不同。以下是COUNT()函数的一些主要功能:计算总行数:当COUNT()函数以*为参数时,它会返回表中的总行数,
sql中count()函数的功能有哪些
2024-04-18

编程热搜

目录