在MYSQL的最新版本MYSQL8已经支持了排名函数RANKDENSE_RANKROW_NUMBER。但是在5.*版本中还不支持这些函数,只能自己实现。实现方法主要用到了条件判断语句(CASE WHENIF)和添加临时变量。

基本知识:

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 连续排名:
  1. 使用ROW_NUMBER实现:
>SELECT score,
ROW_NUMBER() OVER (ORDER BY score DESC) ranking
FROM score;

  1. 使用变量实现:
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 并列跳跃排名
  1. 使用RANK实现:
SELECT course_id, score,RANK() OVER(ORDER BY score DESC)
FROM score;

  1. 使用变量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

Result1

  1. 使用变量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 并列连续排名
  1. 使用DENSE_RANK实现:
SELECT course_id, score,
DENSE_RANK() OVER(ORDER BY score DESC) FROM score;

  1. 使用变量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 ;

  1. 使用变量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 分组连续排名
  1. 使用ROW_NUMBER实现:
SELECT course_id, score,ROW_NUMBER() OVER (PARTITION BY course_id ORDER BY score DESC) ranking
FROM score;

  1. 使用变量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 ;

  1. 使用变量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

Result

4.2 分组并列跳跃排名
  1. 使用RANK实现:
SELECT course_id, score,RANK() OVER(PARTITION BY course_id ORDER BY score DESC)
FROM score;

  1. 使用变量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 分组并列连续排名
  1. 使用DENSE_RANK实现:
SELECT course_id, score,
DENSE_RANK() OVER(PARTITION BY course_id ORDER BY score DESC)
FROM score;

  1. 使用变量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 实现排名(分组排名)相关推荐

  1. mysql 怎么实现组内排名_MySQL 实现排名(分组排名)

    在MYSQL的最新版本MYSQL8已经支持了排名函数RANK,DENSE_RANK和ROW_NUMBER.但是在5.*版本中还不支持这些函数,只能自己实现.实现方法主要用到了条件判断语句(CASE W ...

  2. mysql通过股票代码查数据_如何在交易数据中查询各个版本交易量前三的股票?(MySQL分组排名)...

    SQL查询中,根据列A分组,分组后针对列B执行统计函数,是一件常用也很重要功能,如 select T.a, max(T.b) from T order by T.a asc, T.b desc gro ...

  3. mysql 股票_如何在交易数据中查询各个版本交易量前三的股票?(MySQL分组排名)...

    SQL查询中,根据列A分组,分组后针对列B执行统计函数,是一件常用也很重要功能,如 select T.a, max(T.b) from T order by T.a asc, T.b desc gro ...

  4. MySQL中实现rank排名查询

    MySQL中实现rank排名查询 1.基本知识: 2.升序排列,排名继续增加 3.降序排列,排名继续增加 4.升序排列,排名不跳级,继续+1,示例一 5.升序排列,排名不跳级,继续+1,示例二 6.升 ...

  5. MySql排序并查询排名

    MySql排序并查询排名 SELECT u.uid,u.name,u.score, @rownum := @rownum + 1 AS rownum FROM (SELECT @rownum := 0 ...

  6. Power BI DAX 分组排名 分层排名

    DAX中通常使用迭代函数Rankx,我们首先了解一下Rankx的基础用法: 1.Rankx基本方法 基础数据如上图 首先建立[度量值]--[销售和] 销量和 = SUM('销量明细'[销量]) 再使用 ...

  7. oracle 分组 排名,Oracle数据库之分组查询及排序

    分组查询:使用 group by 来设置分组,把该列具有相同值的多条记录当成一组记录来处理,然后只会输出一条记录,得到的结果会默认使用升序的方式进行排列. 规则: (1)如果使用了分组函数,或者是 g ...

  8. MySQL中实现分组排序

    这几天在项目开发中需要用SQL实现数据的分组排序,以前在oracle的存储过程开发中用过rank函数可以很方便的实现,但是现在在MySQL中是没有类似的,经过上网搜索资料现将MySQL中的数据排序和分 ...

  9. mysql自定义函数分组_mysql中的排序和分组及分组函数

    现实中有很多这样的需求,对全班同学成绩进行排名,将所有的学生信息按照班级来分组,先将学生按班级分组再进行成绩排名等等.今天老韩就来介绍一下如何通过数据库的排序.分组.分组排序来实现这个需求(是排序,不 ...

最新文章

  1. html中ng-src,angularjs – 在ng-src中使用{{}}绑定,但不会加载ng-src
  2. c++ 函数参数问题
  3. signature=fd45b8c9a90eebce5d855f07302ab4ee,Private Use Area
  4. Laravel 教程 - 实战 果酱社区 开源电商 API 系统
  5. VNCTF2021[WEB]
  6. SPSS正态分布,泊松分布,指数分布,均匀分布检验
  7. sqlite3读取一页的数据
  8. absolute 与overflow:hidden常见bug
  9. 聊聊如何做技术战略规划
  10. N,N-二甲基十二烷基胺(CAS 112-18-5)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  11. 如何加入家庭组计算机打印机,解决方案:Win7系统设置家庭组计算机设置共享打印机...
  12. 电磁场与仿真软件(20)
  13. 电脑重装系统以后出现 error: unknown filesystem怎么办?
  14. 微型计算机硬盘安装在哪,微型计算机的硬盘是该机的
  15. c语言上机试题8,7-8-C语言上机考试试题2.doc
  16. 10个适合于高级Java开发人员的外国网站
  17. cv岗工作做什么_2019 秋招 cv 岗求职心得
  18. HTTPS网站提示证书有安全问题的解决方案
  19. 关于时间time和datetime
  20. 使用Fileupload组件上传文本和文件

热门文章

  1. 医学影像特征提取与导出
  2. RuntimeError: CUDA out of memory. Tried to allocate XX.XX MiB. pytorch训练超出撑爆显存的问题
  3. 2.1寸黑白电子标签【蓝牙版】
  4. 图像转成PDF变形BUG调整完成
  5. 流浪者柯南自定义服务器,流放者柯南个人服务器修改怎么配置 个人服务器修改配置路径介绍...
  6. 在小程序的开发上,支付宝或许不是微信的竞争者,而是取代者
  7. 连接模拟器的IP地址、端口号
  8. layui数据表格某个字段不显示问题
  9. java语言特点_Java语言特点及分析
  10. 20221207比对python和C的运行效率(以六元一次方程组为例)【大概300倍】