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