mysql排名函数解析
一、数据准备
sql脚本如下:
Create table If Not Exists Scores (Id int, Score DECIMAL(3,2)); Truncate table Scores; insert into Scores (Id, Score) values ('1', '3.5'); insert into Scores (Id, Score) values ('2', '3.65'); insert into Scores (Id, Score) values ('3', '4.0'); insert into Scores (Id, Score) values ('4', '3.85'); insert into Scores (Id, Score) values ('5', '4.0'); insert into Scores (Id, Score) values ('6', '3.65');
简述:成绩表只有id和成绩两个字段
二、排名函数分类
rank()
作用:
按照某字段的排序结果添加排名,但它是跳跃的、间断的排名,例如两个并列第一名后,下一个是第三名
示例代码:
SELECT score,rank() over(ORDER BY score desc ) as ranked FROM scores;
结果:
+-------+--------+ | score | ranked | +-------+--------+ | 4 | 1 | | 4 | 1 | | 3.85 | 3 | | 3.65 | 4 | | 3.65 | 4 | | 3.5 | 6 | +-------+--------+ 6 rows in set
row_number()
作用:
它是将某字段按照顺序依次添加行号
示例代码:
SELECT score,ROW_number() over(ORDER BY score desc ) as ranked FROM scores;
结果:
+-------+--------+ | score | ranked | +-------+--------+ | 4 | 1 | | 4 | 2 | | 3.85 | 3 | | 3.65 | 4 | | 3.65 | 5 | | 3.5 | 6 | +-------+--------+ 6 rows in set
备注:
只是单纯的添加行号,和成绩字段无关联
dense_rank()
作用:
dense 英语中指“稠密的、密集的”。dense_rank()是的排序数字是连续的、不间断。当有相同的分数时,它们的排名结果是并列的,例如,1,2,2,3
示例代码:
SELECT score,dense_rank() over(ORDER BY score desc ) as ranked FROM scores;
结果:
+-------+--------+ | score | ranked | +-------+--------+ | 4 | 1 | | 4 | 1 | | 3.85 | 2 | | 3.65 | 3 | | 3.65 | 3 | | 3.5 | 4 | +-------+--------+ 6 rows in set
三、总结
函数名 | 关键词 | 作用 | 主要适用场景 |
rank() | 间断、 不连续 | 按顺序输出排名结果,每当出现一个并列结果,则下一个排名数字向后递增一位 | 在并列结果中,每个并列成绩都要占用一个名额的场景 |
dense_rank() | 连续 | 按数学输出排名的名次。当出现并列结果时,下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔” | 当排序结果存在并列成绩时,需要下一个名次于上一个名次是连续整数的情况。 |
row_number() | 行号 | 按顺序输出表的行号 | 需要输出表的行号时 |
知道、想到、做到、得到
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2020-09-17 分布式压测平台之Ngrinder(安装篇)
2020-09-17 Jmeter在linux下运行