当前位置:网站首页 > Haskell函数式编程 > 正文

mysql窗口函数排序(mysql8.0 窗口函数)



以下功能仅MySQL 8.0以上版本支持

参考:https://help.aliyun.com/document_detail/158532.html?spm=a2c4g.11186623.6.863.4aaa6cb2k9RpeD

假设一张表存储了学生的成绩,使用order by可以对查询结果进行排序。
在这里插入图片描述
但如果想获得排序的序号,则需要使用这些函数:row_number(),rank(),dense_rank(),ntile()等等,其特点是都用在SELECT的字段里,输出顺序默认按照序号由小到大(除非在整句sql语句后加上order by)。

1、 row_number() ——序号连续,没有“并列”

用法:row_number() over(order by 排序字段 排序规则)

 

在这里插入图片描述
row_number即为“行数”。输出的序号是连续不重复的,碰到相同的值比如两个98分不会出现“并列第二”。

2、rank() ——序号不连续,会出现“并列”

用法:rank() over(order by 排序字段 排序规则)

 

在这里插入图片描述
rank即为"排名"。输出的序号含有重复值但不连续,会出现“并列第二”的情况,第三名也因此取消而直接到第四名。

3、dense_rank() ——序号连续且有“并列”

用法:dense_rank() over(order by 排序字段 排序规则)

 

在这里插入图片描述
dense_rank即为"压缩排名"。输出的序号有重复值且是连续的,当出现“并列第二”时不会把第三名变成第四,保证每个序号都有一个或多个值。

4、ntile() ——给序号分组

用法:ntile(组数) over(order by 排序字段 排序规则)

 

在这里插入图片描述
总共18条数据中分五组,前面三组有4条数据,后面两组有4条数据。
可看出当不能均分时,分组的策略是尽量均化,先计算18÷5=3······3,则给每组先分配3个,然后再给前三组各分一个。这样就能保证每组数量上最多只差1个。


其他函数还包括percent_rank()、cume_dist()等等与其类似,可参考文档。

当表存储了学生以及对应课程的成绩时,想看每一门课的成绩排名,可以通过order by,先排序课程再排序分数来实现:
在这里插入图片描述
但如果还需要输出序号,这时就要使用到这些函数分组的功能,即在over()的参数中加上partition by 字段名,即表示用该字段来进行分组然后排序。如本例中可以使用rank():

 

在这里插入图片描述
可看到排序结果按照course_id进行了划分,而排序则是按照score来进行。对于row_number(),rank(),dense_rank(),ntile()这类函数,使用方法均类似。这种函数最大的特点就是可以按照字段分组,而无论是where还是group by都是做不到的。这样的函数叫做窗口函数。

 

其中窗口函数可以分为:
1)排序函数,即前面所提到的rank, dense_rank, row_number, nitile, percent_rank和cume_dist
2)聚合函数,如sum. avg, count, max, min等
3)其他函数,如lead, lag, first_value, last_value等
因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中。

下一篇将介绍窗口函数中常用的聚合函数。
到此这篇mysql窗口函数排序(mysql8.0 窗口函数)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • ddpm模型公式(ddm模型例题)2025-03-17 14:00:05
  • 字符串转码技术介绍(字符串转换编码格式)2025-03-17 14:00:05
  • 打开目录的命令(打开目录文件的函数)2025-03-17 14:00:05
  • yml文件如何打开(yml文件格式)2025-03-17 14:00:05
  • redis 哨兵模式配置(redis哨兵模式需要几个节点)2025-03-17 14:00:05
  • pivot函数表格用法(pivot_table函数)2025-03-17 14:00:05
  • 支付方式图片国际结算(支付结算的支付方式)2025-03-17 14:00:05
  • 支付方式图片搞笑(支付方式图片表情包)2025-03-17 14:00:05
  • 如何多级列表自动编号(自定义多级列表编号格式)2025-03-17 14:00:05
  • 计算机零基础编程入门的书(计算机编程零基础教程)2025-03-17 14:00:05
  • 全屏图片