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

mysql窗口函数排序(mysql8.0 窗口函数)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <h4>以下功能仅MySQL 8.0以上版本支持</h4> 

讯享网

参考: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子句中。



下一篇将介绍窗口函数中常用的聚合函数。


小讯
上一篇 2025-04-23 07:04
下一篇 2025-05-08 12:49

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/145929.html