MySQL:如何查询出每个分组中的 top n 条记录?

如题所述

需求:查询出每月order_amount(订单金额) 排行前3的记录。

例如对于2019-02,查询结果中就应该是这3条。

解决方法:

MySQL 5.7 和 MySQL 8.0 有不同的处理方法。

1. MySQL 5.7

我们先写一个查询语句。

根据order_date 中的年、月,和order_amount进行降序排列。

然后,添加一个新列:order_amount(本条记录在本月中的名次)。

执行结果:

可以看到,根据年、月、订单金额排序了,还多了一列order_rank,显示出了本条记录在本月的订单金额排名情况。

上面SQL中比较个性的是这部分:

@current_month和@order_rank 是我们自定义的变量。

使用:= 可以动态创建一个变量,而不需要使用 set 命令。

这句的含义:

取得order_date中的月份值,赋值给current_month,这样就可以跟踪每个月份。

这句的含义:

比较current_month 和本条记录中的月份,如果一样,order_rank 自增1,否则,置为1。

注意,@current_month 是在 @order_rank 的后面,例如执行到这条记录时:

if 判断中,MONTH(order_date) 值为 2,而 current_month 值为 1,还是上条记录设置的。

接下来,把上面的SQL语句作为一个子查询,然后使用一个where 条件就可以轻松拿到每组的 top 3。

最终语句:

执行结果:

2. MySQL 8

MySQL 8 引入了一个rank() 函数,可以更简便的实现排行的功能。

执行结果:

效果和 5.7 中的方法是一致的。

我们看下语句中的rank() 方法:

这样就会自动计算出排行数值。

需要注意的是,这个地方和 5.7 的方法不一样:

就是参与排序的几个值一样的时候,rank 值是一样的。

最终的SQL语句:

翻译整理自:towardsdatascience.com/...

如果您有兴趣实践一下,在公众号“性能与架构”中发送消息:200106,会回复实践笔记的下载地址,包含建表语句、测试数据、MySQL5.7和8.0的这2个查询语句。

推荐阅读:高并发案例 - 库存超发问题 异地多活架构 MySQL order by 是怎么工作的? 如何判断一个元素是否存在于一个亿级数据集中? Zookeeper vs Etcd MySQL8 的 Hash join 算法 weixin.qq.com/r/X0MNFdH...
温馨提示:内容为网友见解,仅供参考
无其他回答

MySQL:如何查询出每个分组中的 top n 条记录?
我们先写一个查询语句。根据order_date 中的年、月,和order_amount进行降序排列。然后,添加一个新列:order_amount(本条记录在本月中的名次)。执行结果:可以看到,根据年、月、订单金额排序了,还多了一列order_rank,显示出了本条记录在本月的订单金额排名情况。上面SQL中比较个性的是这部分:cu...

Mysql 分组查询top n(多种方法)
查询每门科目的前3名。对于查询的结果,一般有两种情况。表所有数据为:情况1:对于分数相同的人,其后面的人 紧跟着名次排,直到排够名次3,就不再往后取了。情况2:对于分数相同的人,若当前相同名次的人数大于或等于 3, 则相同分数其后面的人不再参于top3了。在情况2中 ,为什么”李四 - java...

MySQL中Top的使用方法mysql中top用法
语法 在MySQL中,Top语句的基本语法如下:SELECT column_name(s) FROM table_name ORDER BY column_name(s) DESC LIMIT number;其中,column_name是需要查询的列名称,table_name是需要查询的表格名称,在ORDER BY子句中指定该列按照降序排列,LIMIT子句指定前N条记录。如果需要查询前N个升序的值,只需...

Mysql查询数据库表中前几条记录
在查询分析器中输入select*fromstudentlimit5;即可查询到下图的情况:所以说,在Mysql中取出表中前几条记录是用关键字 limit,而在Sql-server中则是用top关键字,但是Mysql子查询却不支持 limit ,也就是说,如:select*fromuserswhereidnotin(selectidfromuserslimit3)and1limit3;是有语法错误的,\/* ...

MySQL中如何使用关键字TOP进行筛选mysql中关键字top
其中,number是要返回的行数,column_name(s)是要查询的列名,table_name是要查询的表名,condition是查询的条件。例如,要返回表“students”中前5条记录的“name”和“score”列,可以使用以下语句:SELECT TOP 5 name, score FROM students;在MySQL中,没有TOP关键字,但可以使用LIMIT关键字来实现...

MySql怎么查询前10条数据?
在MySQL中,如果你需要查询表中的前10条数据,通常的做法并不是直接使用SELECT语句中的"TOP"关键字,因为MySQL并不支持这种方法。相反,你可以通过LIMIT子句来实现这一功能。正确的语法是:sql SELECT * FROM 表名 LIMIT m, n;这里的"m"表示从第m+1行开始(因为索引是从0开始的,所以如果你想从第...

在MYSQL中怎么写SQL语句,能取到表中按ID降序排列的前五条记录??
具体语法参考:以下是 SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:from 树懒学堂 - 一站式数据知识平台 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。你可以设定多个字段来排序。你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,...

MySql怎么查询前10条数据?
在MySQL中,当我们需要查询数据表的前10条记录时,并非直接使用"top"这样的命令,而是采用另一种简洁的语法。limit关键字在此起到了关键作用。其基本使用格式是:limit m, n,其中m表示要返回的记录起始位置,n表示返回的记录数量。如果省略n,系统默认返回的是从m开始的所有记录,直到达到表的末尾或者...

MySql怎么查询前10条数据?
MYSQL没有SELECT TOP的语法,你得用用LIMIT select * from 表名 limit m,n;从m开始,取n条

MYSQL如何查询记录集的前3条记录
第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)select scrname,stucount from scrtab select top 3 scrname,stucount from scrtab order by stucount 先按人数排序,然后在查出前三个 sql server查询前n条记录:因为id可能不是连续的,所以不能用取得10 ...

相似回答
大家正在搜