分享好友 最新动态首页 最新动态分类 切换频道
mysql8 中的rank_Mysql8.0+中的rank()、row_num()、dense_rank()等窗口函数
2024-12-27 09:13

在低于Mysql8.0之前的版本中,要对序列进行排序的话需要用到自定义参数@,但是8.0+版本中加入了oracle中的窗口函数,rank()、row_num()、dense_rank()等函数。

mysql8 中的rank_Mysql8.0+中的rank()、row_num()、dense_rank()等窗口函数

下面简单举几个例子介绍下这几个函数的应用。测试用的表主要有两个,一个是学生信息表student,二是学生分数表sc,具体的测试数据的mysql插入语句在另一篇博客:Mysql经典练习题与知识点总结中,大家可以在Mysql中试着插入并测试。但Mysql的版本要高于8.0,具体安装过程可以在其他博客中找一下。

row_number()

它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。

row_num() over (order by字段1)以字段1排序,生成行号

rank()

用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。

rank() over (partition by字段1 order by 字段2)

按字段1分组并按字段2倒序排序,输出结果。partition by非必要,order by是必要的。

partition by非必要,order by必要

dense_rank()

与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。

dense_rank() over (partition by字段1 order by 字段2)

关于partition by和group by的区别

partition by一般用于over字句中,group by顺序正常

partition by会保留所有的记录,并依据order by的结果依次输出,而group by则通常与聚合函数一起使用,只会返回聚合后的唯一记录。

student表

+------+-------+---------------------+------+

| Sid | Sname | Sage | Ssex |

+------+-------+---------------------+------+

| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |

| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |

| 03 | 孙风 | 1990-05-20 00:00:00 | 男 |

| 04 | 李云 | 1990-08-06 00:00:00 | 男 |

| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |

| 06 | 吴兰 | 1992-03-01 00:00:00 | 女 |

| 07 | 郑竹 | 1989-07-01 00:00:00 | 女 |

| 08 | 王菊 | 1990-01-20 00:00:00 | 女 |

+------+-------+---------------------+------+

8 rows in set (0.00 sec)

sc表

+------+------+-------+

| Sid | Cid | score |

+------+------+-------+

| 01 | 01 | 80.0 |

| 01 | 02 | 90.0 |

| 01 | 03 | 99.0 |

| 02 | 01 | 70.0 |

| 02 | 02 | 60.0 |

| 02 | 03 | 80.0 |

| 03 | 01 | 80.0 |

| 03 | 02 | 80.0 |

| 03 | 03 | 80.0 |

| 04 | 01 | 50.0 |

| 04 | 02 | 30.0 |

| 04 | 03 | 20.0 |

| 05 | 01 | 76.0 |

| 05 | 02 | 87.0 |

| 06 | 01 | 31.0 |

| 06 | 03 | 34.0 |

| 07 | 02 | 89.0 |

| 07 | 03 | 98.0 |

+------+------+-------+

18 rows in set (0.00 sec)

rank()和dense_rank()

1. 对学生总成绩从大到小排序,并查询学生信息,没有成绩的也显示。

SELECT

s.*, rank () over (ORDER BY sum(sc.score) DESC) AS rank_01

FROM

student s LEFT JOIN

sc

ON

s.Sid = sc.Sid

GROUP BY

sc.Sid;

结果

+------+-------+---------------------+------+---------+

| Sid | Sname | Sage | Ssex | rank_01 |

+------+-------+---------------------+------+---------+

| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 | 1 |

| 03 | 孙风 | 1990-05-20 00:00:00 | 男 | 2 |

| 02 | 钱电 | 1990-12-21 00:00:00 | 男 | 3 |

| 07 | 郑竹 | 1989-07-01 00:00:00 | 女 | 4 |

| 05 | 周梅 | 1991-12-01 00:00:00 | 女 | 5 |

| 04 | 李云 | 1990-08-06 00:00:00 | 男 | 6 |

| 06 | 吴兰 | 1992-03-01 00:00:00 | 女 | 7 |

| 08 | 王菊 | 1990-01-20 00:00:00 | 女 | 8 |

+------+-------+---------------------+------+---------+

如果见到null的情况下要显示,则需要left join

rank() over(partition by 字段1 order by字段2 desc) 按字段1分组并按字段2倒序排序,输出结果。partition by非必要,order by是必要的。

2、查询各科成绩前三名的记录

SELECT * FROM

(SELECT *, rank () over (PARTITION BY Cid ORDER BY score DESC) AS grade

FROM sc) AS t

WHERE t.grade <= 3;

+------+------+-------+-------+

| Sid | Cid | score | grade |

+------+------+-------+-------+

| 01 | 01 | 80.0 | 1 |

| 03 | 01 | 80.0 | 1 |

| 05 | 01 | 76.0 | 3 |

| 01 | 02 | 90.0 | 1 |

| 07 | 02 | 89.0 | 2 |

| 05 | 02 | 87.0 | 3 |

| 01 | 03 | 99.0 | 1 |

| 07 | 03 | 98.0 | 2 |

| 02 | 03 | 80.0 | 3 |

| 03 | 03 | 80.0 | 3 |

+------+------+-------+-------+

10 rows in set (0.00 sec)

如果要对rank的结果进行进一步选择的话,采用结构select * from (select rank()) where 的句式

最新文章
成品网站 W灬源码 1277 免费版,专注于为用户提供高品质的网站建设服务
在当今数字化时代,拥有一个高品质的网站对于个人或企业来说至关重要。一个好的网站不仅可以提升品牌形象,还可以增加用户粘性和转化率。对于很多人来说,网站建设可能是一项具有挑战性的任务。这时候,成品网站 W灬源码 1277 免费版就成为
(智慧工地)解决方案
近年来随着我国基建行业的快速发展,产业规模的不断扩大,建筑工地作为一个安全事故多发的高危地,具有施工现场管理人员复杂、环境杂乱、多工种交叉作业等弊端,且呈现管理粗放、施工地分散全国甚至全世界等特性,建筑工程建设70%左右的工
置顶云模板-小程序跳转微信小店精选热门
用于配置在小程序中展示的微信小店店铺和商品。模板只包含数据模型,用于配置在小程序中展示的微信小店店铺和商品,需配合小程序打开微信小店全码模板使用。展示微信小店首页和商品列表点击小店跳转到微信小店小店跳转指引点击商品跳转到商
形象管理必备神器!这些内增高鞋让你职场气场全开!
职场中,第一印象至关重要。无论是与客户会面,还是在团队中展现自信和气度,穿着得体、形象出众的职场人士,往往能赢得更多的关注和尊重。而作为一名职场男士,鞋履的选择在整体形象中起到了至关重要的作用。一双适合的内增高鞋,不仅能提
构建房地产营销新引擎,高效建设与网页推广策略
本文探讨了房地产建设与网页推广策略,旨在打造高效营销。文章从设计、功能优化、内容营销、社交媒体推广等方面提供全方位指导,帮助房地产企业提升品牌影响力,实现营销,提高率。房地产建设概述房地产网页推广技巧在互联网技术的迅猛推动
泰安济南SEO优化,企业在线崛起的关键策略揭秘
泰安济南SEO优化公司,凭借专业技术和创新策略,助力企业在线崛起。通过精准关键词布局、优质内容创作和网站结构优化,提升企业网站在搜索引擎中的排名,吸引更多潜在客户,实现线上业务增长。企业选择泰安济南SEO优化公司,是迈向在线成功
全球香水品牌价值巅峰榜,价位排序版,前100名香水品牌大揭秘
在男士香水品牌的领域中,香奈儿以其卓越的工艺和独特的魅力,自1910年创立以来,便以其奢华与优雅著称,经典之作如No.5香水和小黑裙,赢得了全球消费者的心,迪奥品牌自1947年诞生,以其皮具、服饰、化妆品和精致饰品闻名,成为众多明星出
玛拉斐尔官方天猫旗舰商城——正品保障,全场优惠,限时抢购
玛拉斐尔女装隶属于郑州素旅服饰旗下自成立以来一直致力于追求高品质女装的打造。秉承“聚财先积才”的诚信管理理念注重企业文化和现代时装管理内涵的提升,旨在为消费者提供兼具时尚与品质的服装选择。为了更好地服务广大消费者,玛拉斐尔
蛙漫manwa漫画
蛙漫manwa漫画是一款可以给用户提供正版资源的漫画阅读软件,拥有着非常简洁的操作界面,可以给用户打造出全面的漫画互动格局,让用户随时都可以来挑选,遇到自己喜欢的漫画,还可以自由收藏。1、首先我们下载好最新版本的蛙漫manwa漫画,
相关文章
推荐文章
发表评论
0评