以下功能仅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 窗口函数)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/haskellbc/38413.html