文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么用MySQL窗口函数实现榜单排名

2023-07-06 01:35

关注

本篇内容主要讲解“怎么用MySQL窗口函数实现榜单排名”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用MySQL窗口函数实现榜单排名”吧!

首先,先建一个测试表

create table praise_record(    id bigint primary key auto_increment,    name varchar(10),    praise_num int) ENGINE=InnoDB;

然后让chatGpt给我们生成几条测试数据

INSERT INTO praise_record (name, praise_num) VALUES ('John', 5);INSERT INTO praise_record (name, praise_num) VALUES ('Jane', 3);INSERT INTO praise_record (name, praise_num) VALUES ('Bob', 10);INSERT INTO praise_record (name, praise_num) VALUES ('Alice', 3);INSERT INTO praise_record (name, praise_num) VALUES ('David', 7);INSERT INTO praise_record (name, praise_num) VALUES ('oct', 7);

然后就可以开始实现我们的需求:返回点赞的榜单,并返回排名

rank()

使用rank()函数返回点赞的榜单, rank() over()

## 注意这里返回的rank字段要用反引号包起来select name, praise_num, rank() over (order by praise_num desc) as `rank` from praise_record;+-------+------------+------+| name  | praise_num | rank |+-------+------------+------+| Bob   |         10 |    1 || David |          7 |    2 || oct   |          7 |    2 || John  |          5 |    4 || Jane  |          3 |    5 || Alice |          3 |    5 |+-------+------------+------+

可以看到使用rank()函数的时候相同的点赞数会返回相同的排名,排名会产生跳跃,最终的排名不是连续的

dense_rank()

使用dense_rank()函数返回点赞的榜单, dense_rank() over()

 select name, praise_num, dense_rank() over (order by praise_num desc) as `rank` from praise_record;  +-------+------------+------+| name  | praise_num | rank |+-------+------------+------+| Bob   |         10 |    1 || David |          7 |    2 || oct   |          7 |    2 || John  |          5 |    3 || Jane  |          3 |    4 || Alice |          3 |    4 |+-------+------------+------+

与rank()函数相同的是,相同点赞数会返回相同的排名,但是dense_rank()返回的最终排名是连续的排名

row_number()

row_number()函数返回点赞的榜单,row_number() over()

 select name, praise_num, row_number() over (order by praise_num desc) as `rank` from praise_record; +-------+------------+------+| name  | praise_num | rank |+-------+------------+------+| Bob   |         10 |    1 || David |          7 |    2 || oct   |          7 |    3 || John  |          5 |    4 || Jane  |          3 |    5 || Alice |          3 |    6 |+-------+------------+------+

row_number()函数适合当返回的列表只需要序号时使用

以上三个函数都是MySQL8.0新加入的,所以在MySQL5.7这些老版本上我们可以模拟实现一下,顺便学习一下这三个窗口函数的实现原理

rank()函数的模拟实现

select p1.name, p1.praise_num, count(p2.praise_num) + 1 as `rank` from praise_record p1left join praise_record p2 on p1.praise_num < p2.praise_numgroup by p1.name, p1.praise_numorder by `rank`;+-------+------------+------+| name  | praise_num | rank |+-------+------------+------+| Bob   |         10 |    1 || David |          7 |    2 || oct   |          7 |    2 || John  |          5 |    4 || Jane  |          3 |    5 || Alice |          3 |    5 |+-------+------------+------+

我们可以使用自联接的方式将每个分数低于当前行分数的记录计数,最后将计数值加1作为当前行的排名,来模拟实现rank()

dense_rank()的模拟实现

select p1.name, p1.praise_num, count(distinct p2.praise_num) + 1 as `dense_rank` from praise_record p1left join praise_record p2 on p1.praise_num < p2.praise_numgroup by p1.name, p1.praise_numorder by `dense_rank`;+-------+------------+------------+| name  | praise_num | dense_rank |+-------+------------+------------+| Bob   |         10 |          1 || oct   |          7 |          2 || David |          7 |          2 || John  |          5 |          3 || Jane  |          3 |          4 || Alice |          3 |          4 |+-------+------------+------------+

dense_rank的实现与rank差不多,唯一的区别是增加了distinct对点赞数做了去重,这样子对不同的点赞数返回的排名就是连续的

row_number的模拟实现

##使用自定义变量得先初始化set @rowNum = 0;select name, praise_num, @rowNum := @rowNum +1 as `row_number`  from praise_record order by praise_num desc ;+-------+------------+------------+| name  | praise_num | row_number |+-------+------------+------------+| Bob   |         10 |          1 || David |          7 |          2 || oct   |          7 |          3 || John  |          5 |          4 || Jane  |          3 |          5 || Alice |          3 |          6 |+-------+------------+------------+

我们可以使用一个rowNum变量来记录行号,每一行的数据rowNUm都+1,这样子就可以得到我们想要的序号

到此,相信大家对“怎么用MySQL窗口函数实现榜单排名”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯