没有窗口函数,MySQL应该怎么实现《分组排名》呢?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 没有窗口函数,MySQL应该怎么实现《分组排名》呢?

1.数据源

image.png


2.数据整体排名

1)普通排名

从1开始,按照顺序一次往下排(相同的值也是不同的排名)。


set @rank =0;
select 
  city ,
  score, 
  @rank := @rank+1 rank 
from cs 
order by score desc;


结果如下:

image.png


2)并列排名

相同的值是相同的排名(但是不留空位)。


set @rank=0,@price=null;
select cs.* ,
 case when @price = score then @rank 
 when @price := score then @rank := @rank+1 end rank  
 from cs order by score desc;
 -- 当查询的score 值 = @price时,输出@rank,
 -- 当不等时,将score值赋给@price ,并输出@rank := @rank+1
-- 或者
set @rank=0,@price=null;
select 
  a.city,a.score,a.rank 
from 
(select cs.*,
  @rank := if(@p=score,@rank,@rank+1) rank,
  @p := score
from cs 
order by score desc) a;


结果如下:

image.png


3)并列排名

相同的值是相同的排名(但是留空位)。


set @rank=0,@price=null, @z=1;
select 
  a.city,a.score,a.rank 
from 
(select 
  cs.*,
  @rank := if(@p=score,@rank,@z) rank,
  @p := score,@z :=@z+1
from cs 
order by score desc) a;


结果如下:

image.png


3.数据分组后组内排名

1)分组普通排名

从1开始,按照顺序一次往下排(相同的值也是不同的排名)。


set @rank=0,@c=null;
select 
  cs.city,cs.score,
  @rank := if(@c = city,@rank+1,1) rank,
  @c := city
from cs 
order by cs.city,cs.score;


结果如下:

image.png


2)分组后并列排名

组内相同数值排名相同,不占空位。


set @rank=0,@c=null,@s=null;
select 
  cs.city,cs.score,
  @rank := if(@c=city,if(@s=score,@rank,@rank+1),1) rank ,
  @c := city,
  @s :=score 
from cs 
order by cs.city,cs.score;


结果如下:

image.png


3)分组后并列排名

组内相同数值排名相同,需要占空位。


set @rank=0,@z=0,@c=null,@s=null;
select 
  cs.city,cs.score,
  @z := if(@c=city,@z+1,1),
  @rank := if(@c=city,if(@s=score,@rank,@z),1) rank,
  @c := city,
  @s :=score 
from cs 
order by cs.city,cs.score;


结果如下:

image.png


4.分组后取各组的前两名

① 方法一:按照分组排名的三种方式,然后限定排名的值

set @rank=0,@z=0,@c=null,@s=null;
select a.city,a.score,a.rank from 
(select 
  cs.city city,cs.score score,
  @z := if(@c=city,@z+1,1),
  @rank := if(@c=city,if(@s=score,@rank,@z),1) rank,
  @c := city,
  @s :=score 
from cs 
order by cs.city,cs.score desc) a
where a.rank<=2;


结果如下:

image.png


② 内部查询

SELECT * FROM cs c
WHERE (
    SELECT count(*) FROM cs
    WHERE c.city=cs.city AND c.score<cs.score )<2
ORDER BY city,score DESC;


结果如下:

image.png

上述代码的执行原理如下图:

image.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
存储 关系型数据库 MySQL
MySQL中实施排序(sorting)及分组(grouping)操作的技巧。
使用这些技巧时,需要根据实际的数据量、表的设计和服务器性能等因素来确定最合适的做法。通过反复测试和优化,可以得到最佳的查询性能。
292 0
|
12月前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
528 11
|
SQL 关系型数据库 MySQL
MySQL8 窗口函数
MySQL 8 引入了窗口函数,这是一种强大的分析工具,可以在查询结果集中执行计算而无需将数据分组到多个输出行中。本文介绍了窗口函数的基本概念和使用方法,并通过几个实际案例展示了如何使用窗口函数进行成绩和排名统计、销售数据分析等操作。
461 1
MySQL8 窗口函数
|
移动开发 关系型数据库 MySQL
MySQL中的ROW_NUMBER窗口函数简单了解下
ROW_NUMBER是 MySQL8引入的窗口函数之一,它为查询结果集中的每一行分配一个唯一的顺序号(行号)。ROW_NUMBER在分页、去重、分组内排序等场景中非常有用。
580 4
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
算法 关系型数据库 MySQL
MySQL高级篇——排序、分组、分页优化
排序优化建议、案例验证、范围查询时索引字段选择、filesort调优、双路排序和单路排序、分组优化、带排序的深分页优化
MySQL高级篇——排序、分组、分页优化
|
SQL 关系型数据库 MySQL
MySQL】-DQL(基本、条件、分组、排序、分页)详细版
通过这些查询方法,你可以高效地检索、分析和组织MySQL数据库中的数据,以满足各种应用需求。实践中,理解这些SQL语句的基础知识以及它们如何组合起来进行复杂的数据操作是至关重要的。
215 1
|
关系型数据库 MySQL 数据挖掘
MySQL窗口函数:原理和使用
MySQL窗口函数:原理和使用
|
关系型数据库 MySQL 数据挖掘
MySQL窗口函数详解(概念+练习+实战)
MySQL窗口函数详解(概念+练习+实战)
2752 1
|
SQL 关系型数据库 MySQL
MySQL获取分组里的最新数据如何写sql
MySQL获取分组里的最新数据如何写sql
206 0

推荐镜像

更多