MySQL 实现排名(分组排名)
在MYSQL的最新版本MYSQL8已经支持了排名函数RANK
,DENSE_RANK
和ROW_NUMBER
。但是在5.*版本中还不支持这些函数,只能自己实现。实现方法主要用到了条件判断语句(CASE WHEN
或IF
)和添加临时变量。
基本知识:
sql语句中,使用@来定义一个变量。如:@abc
sql语句中,使用:=来给变量赋值,:@abc:=123,则变量abc的值为123
sql语句中,if(A,B,C)表示,如果A条件成立,那么执行B,否则执行C,如:@abc := if(2>1,100,200)的结果是,abc的值为100。
一、排名分类:
1.1 区别RANK,DENSE_RANK和ROW_NUMBER
RANK并列跳跃排名:,并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,跳跃到总共的排名。
DENSE_RANK并列连续排序:,并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,依然按照连续数字排名。
ROW_NUMBER连续排名:,即使相同的值,依旧按照连续数字进行排名。
二、数据准备:
创建一张分数表,里面有字段:分数score,课程号course_id和学生号student_id。执行如下SQL语句,进行导入数据。
create table score(student_id varchar(10),course_id varchar(10),score decimal(18,1)
);
insert into score values('01' , '01' , 80);
insert into score values('01' , '02' , 90);
insert into score values('01' , '03' , 99);
insert into score values('02' , '01' , 70);
insert into score values('02' , '02' , 60);
insert into score values('02' , '03' , 80);
insert into score values('03' , '01' , 80);
insert into score values('03' , '02' , 80);
insert into score values('03' , '03' , 80);
insert into score values('04' , '01' , 50);
insert into score values('04' , '02' , 30);
insert into score values('04' , '03' , 20);
insert into score values('05' , '01' , 76);
insert into score values('05' , '02' , 87);
insert into score values('06' , '01' , 31);
insert into score values('06' , '03' , 34);
insert into score values('07' , '02' , 89);
insert into score values('07' , '03' , 98);
insert into score values('08' , '02' , 89);
insert into score values('09' , '02' , 89);
三、不分组排名
3.1 连续排名:
- 使用
ROW_NUMBER
实现:
>SELECT score,
ROW_NUMBER() OVER (ORDER BY score DESC) ranking
FROM score;
- 使用
变量
实现:
SELECT s.score,(@cur_rank := @cur_rank + 1) AS Rank
FROM score s,(SELECT @cur_rank := 0) r
ORDER BY s.score DESC
3.2 并列跳跃排名
- 使用
RANK
实现:
SELECT course_id, score,RANK() OVER(ORDER BY score DESC)
FROM score;
- 使用
变量
和IF
语句实现:
SELECT s.score ,@cur_count := @cur_count + 1,if(@pre_score = s.score,@cur_rank,@cur_rank := @cur_count) ranking,@pre_score := s.score
FROM score s,(SELECT @cur_count := 0,@cur_rank:=0,@pre_score := NULL) t
ORDER BY s.score DESC
![](http://upload-images.jianshu.io/upload_images/9416866-3f25070f01ad83b1.png?imageMogr2/auto-orient/strip|imageView2/2/w/444/format/webp)
- 使用
变量
和CASE
来实现:
SELECT s.score,
@cur_count := @cur_count + 1,
(case when @pre_score = s.score then @cur_rankwhen @pre_score := s.score then @cur_rank := @cur_count END
) ranking,
@pre_score := s.score
FROM score s,(SELECT @cur_count := 0,@cur_rank := 0,@pre_score := NULL) r
ORDER BY s.score DESC ;
3.3 并列连续排名
- 使用
DENSE_RANK
实现:
SELECT course_id, score,
DENSE_RANK() OVER(ORDER BY score DESC) FROM score;
- 使用
变量
和IF
语句实现:
SELECT s.score,@cur_rank := @cur_rank + 1 ranking
FROM SCORE s,(SELECT @pre_score := NULL ,@cur_rank := 0) r
ORDER BY s.score DESC ;
- 使用
变量
和CASE
语句实现:
SELECT s.score,case when @pre_score = score then @cur_rankwhen @pre_score := score then @cur_rank := @cur_rank + 1 END ranking
FROM SCORE s,(SELECT @pre_score := NULL ,@cur_rank := 0) r
ORDER BY s.score DESC ;
四、分组排名
4.1 分组连续排名
- 使用
ROW_NUMBER
实现:
SELECT course_id, score,ROW_NUMBER() OVER (PARTITION BY course_id ORDER BY score DESC) ranking
FROM score;
- 使用
变量
和IF
实现:
SELECT s.course_id,s.score,if(@pre_course_id = s.course_id,@cur_rank := @cur_rank + 1 ,@cur_rank := 1) ranking,@pre_course_id := s.course_id
FROM score s,(SELECT @cur_rank := 0 ,@pre_course_id := NULL) r
ORDER BY s.course_id,s.score DESC ;
- 使用
变量
和CASE
实现:
SELECT s.course_id,s.score,(case when @pre_course_id = s.course_id then @cur_rank := @cur_rank + 1when @pre_course_id := s.course_id then @cur_rank := 1 end) ranking
FROM score s ,(SELECT @cur_rank := 0 ,@pre_course_id := NULL) r
ORDER BY s.course_id,s.score DESC
![](http://upload-images.jianshu.io/upload_images/9416866-0a393171338f248a.png?imageMogr2/auto-orient/strip|imageView2/2/w/206/format/webp)
4.2 分组并列跳跃排名
- 使用
RANK
实现:
SELECT course_id, score,RANK() OVER(PARTITION BY course_id ORDER BY score DESC)
FROM score;
- 使用
变量
和IF
语句实现:
SELECT s.course_id, s.score,
IF(@pre_course_id = s.course_id,@rank_counter := @rank_counter + 1,@rank_counter := 1) temp1,
IF(@pre_course_id = s.course_id,IF(@pre_score = s.score, @cur_rank, @cur_rank := @rank_counter),@cur_rank := 1) ranking,
@pre_score := s.score temp2,
@pre_course_id := s.course_id temp3
FROM score s, (SELECT @cur_rank := 0, @pre_course_id := NULL, @pre_score := NULL, @rank_counter := 1)r
ORDER BY s.course_id, s.score DESC;
4.3 分组并列连续排名
- 使用
DENSE_RANK
实现:
SELECT course_id, score,
DENSE_RANK() OVER(PARTITION BY course_id ORDER BY score DESC)
FROM score;
- 使用
变量
和IF
语句实现:
SELECT s.course_id, s.score,IF(@pre_course_id = s.course_id,IF(@pre_score = s.score, @cur_rank, @cur_rank := @cur_rank + 1),@cur_rank := 1) ranking,@pre_score := s.score,@pre_course_id := s.course_id
FROM score s, (SELECT @cur_rank :=0, @pre_score = NULL, @pre_course_id := NULL) r
ORDER BY course_id, score DESC;
可以将上述的IF条件提取出来:
SELECT s.course_id, s.score,IF(@pre_score = s.score, @cur_rank, @cur_rank := @cur_rank + 1) temp1,@pre_score := s.score temp2,IF(@pre_course_id = s.course_id, @cur_rank, @cur_rank := 1) ranking,@pre_course_id := s.course_id
FROM score s, (SELECT @cur_rank :=0, @pre_score = NULL, @pre_course_id := NULL) r
ORDER BY course_id, score DESC;
参考:https://blog.csdn.net/u011726005/article/details/94592866
http://www.taodudu.cc/news/show-6899752.html
相关文章:
- SQL明细数据排名,取前TOP10
- 《MySQL必修课:存储引擎大揭秘!InnoDB和MyISAM究竟谁更强?》
- mysql数据排名
- 《MySQL必修课:狙击海量数据!教你如何进行索引分析与SQL查询优化!》
- 英文pdf翻译软件哪个好?这三款你怎能错过
- 翻译英文的软件哪个好?这些软件值得一试
- 哪些英语翻译软件好用?分享这三款好用的翻译软件
- 语音翻译英文翻译中文的软件有哪些
- console.read()的特殊用法及解决
- read用法
- 计算机主机的物理硬件组成,计算机硬件组成和功能
- Mac OSX下破解软件的一般方法及过程
- 破解mac密码
- securecrt for Mac安装及破解
- MAC安装、破解StartUML-5.0.2-arm64.dmp
- 笔记本拆机清灰,换硅脂,升级改造链接
- 笔记本电脑清灰换硅脂
- 【轻松学习】教你十分钟学会Python函数式编程
- 【Python学习过程】关于入门Python初期接触到的函数
- 05 python 要点 (函数式编程)
- Python开发技术—函数设计1
- 第48讲:Python中函数的概念以及应用案例
- 路由器的用途浅析
- python写爬虫的优势-用Python做爬虫有哪些优势 该怎么学好Python
- chatgpt赋能python:用Python计算BIM:优点、应用和结论
- 路由器硬件组成
- 浅谈路由器的路由功能
- 用Python写爬虫有哪些好处?
- Python的优点(优势)
- 路由器 内核开发 流程
MySQL 实现排名(分组排名)相关推荐
- mysql 怎么实现组内排名_MySQL 实现排名(分组排名)
在MYSQL的最新版本MYSQL8已经支持了排名函数RANK,DENSE_RANK和ROW_NUMBER.但是在5.*版本中还不支持这些函数,只能自己实现.实现方法主要用到了条件判断语句(CASE W ...
- mysql通过股票代码查数据_如何在交易数据中查询各个版本交易量前三的股票?(MySQL分组排名)...
SQL查询中,根据列A分组,分组后针对列B执行统计函数,是一件常用也很重要功能,如 select T.a, max(T.b) from T order by T.a asc, T.b desc gro ...
- mysql 股票_如何在交易数据中查询各个版本交易量前三的股票?(MySQL分组排名)...
SQL查询中,根据列A分组,分组后针对列B执行统计函数,是一件常用也很重要功能,如 select T.a, max(T.b) from T order by T.a asc, T.b desc gro ...
- MySQL中实现rank排名查询
MySQL中实现rank排名查询 1.基本知识: 2.升序排列,排名继续增加 3.降序排列,排名继续增加 4.升序排列,排名不跳级,继续+1,示例一 5.升序排列,排名不跳级,继续+1,示例二 6.升 ...
- MySql排序并查询排名
MySql排序并查询排名 SELECT u.uid,u.name,u.score, @rownum := @rownum + 1 AS rownum FROM (SELECT @rownum := 0 ...
- Power BI DAX 分组排名 分层排名
DAX中通常使用迭代函数Rankx,我们首先了解一下Rankx的基础用法: 1.Rankx基本方法 基础数据如上图 首先建立[度量值]--[销售和] 销量和 = SUM('销量明细'[销量]) 再使用 ...
- oracle 分组 排名,Oracle数据库之分组查询及排序
分组查询:使用 group by 来设置分组,把该列具有相同值的多条记录当成一组记录来处理,然后只会输出一条记录,得到的结果会默认使用升序的方式进行排列. 规则: (1)如果使用了分组函数,或者是 g ...
- MySQL中实现分组排序
这几天在项目开发中需要用SQL实现数据的分组排序,以前在oracle的存储过程开发中用过rank函数可以很方便的实现,但是现在在MySQL中是没有类似的,经过上网搜索资料现将MySQL中的数据排序和分 ...
- mysql自定义函数分组_mysql中的排序和分组及分组函数
现实中有很多这样的需求,对全班同学成绩进行排名,将所有的学生信息按照班级来分组,先将学生按班级分组再进行成绩排名等等.今天老韩就来介绍一下如何通过数据库的排序.分组.分组排序来实现这个需求(是排序,不 ...
最新文章
- html中ng-src,angularjs – 在ng-src中使用{{}}绑定,但不会加载ng-src
- c++ 函数参数问题
- signature=fd45b8c9a90eebce5d855f07302ab4ee,Private Use Area
- Laravel 教程 - 实战 果酱社区 开源电商 API 系统
- VNCTF2021[WEB]
- SPSS正态分布,泊松分布,指数分布,均匀分布检验
- sqlite3读取一页的数据
- absolute 与overflow:hidden常见bug
- 聊聊如何做技术战略规划
- N,N-二甲基十二烷基胺(CAS 112-18-5)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 如何加入家庭组计算机打印机,解决方案:Win7系统设置家庭组计算机设置共享打印机...
- 电磁场与仿真软件(20)
- 电脑重装系统以后出现 error: unknown filesystem怎么办?
- 微型计算机硬盘安装在哪,微型计算机的硬盘是该机的
- c语言上机试题8,7-8-C语言上机考试试题2.doc
- 10个适合于高级Java开发人员的外国网站
- cv岗工作做什么_2019 秋招 cv 岗求职心得
- HTTPS网站提示证书有安全问题的解决方案
- 关于时间time和datetime
- 使用Fileupload组件上传文本和文件
热门文章
- 医学影像特征提取与导出
- RuntimeError: CUDA out of memory. Tried to allocate XX.XX MiB. pytorch训练超出撑爆显存的问题
- 2.1寸黑白电子标签【蓝牙版】
- 图像转成PDF变形BUG调整完成
- 流浪者柯南自定义服务器,流放者柯南个人服务器修改怎么配置 个人服务器修改配置路径介绍...
- 在小程序的开发上,支付宝或许不是微信的竞争者,而是取代者
- 连接模拟器的IP地址、端口号
- layui数据表格某个字段不显示问题
- java语言特点_Java语言特点及分析
- 20221207比对python和C的运行效率(以六元一次方程组为例)【大概300倍】