mysql 分组top_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() 方法:
PARTITION BY 是指定分区依据,这里是根据订单的年、月进行分区。
ORDER BY 指定了分区内的排序依据,这里是根据订单的 年、月、金额 进行降序排列。
这样就会自动计算出排行数值。
需要注意的是,这个地方和 5.7 的方法不一样:
就是参与排序的几个值一样的时候,rank 值是一样的。
最终的SQL语句:
翻译整理自:
如果您有兴趣实践一下,在公众号“性能与架构”中发送消息:200106,会回复实践笔记的下载地址,包含建表语句、测试数据、MySQL5.7和8.0的这2个查询语句。
推荐阅读:
mysql 分组top_MySQL:如何查询出每个分组中的 top n 条记录?相关推荐
- 查询出每个分组中的 top n 条记录
问题描述 需求: 查询出每月 order_amount(订单金额) 排行前3的记录. 例如对于2019-02,查询结果中就应该是这3条: 解决方法 MySQL 5.7 和 MySQL 8.0 有不同的 ...
- MySQL数据库中如何查询分组后每组中的最后一条记录
MySQL数据库中如何查询分组后每组中的最后一条记录 方法一 select * from messages where id in (select max(id)fom messages group ...
- SQL分组查询后取每组的前N条记录
本文由 Leon 同学授权发布 这个公众号的关注者除了大部分是 Android 工程师之外还有部分后端以及前端同学,我鼓励也非常欢迎大家来投稿,其实我们并不需要把自己限定在某个领域,多学学其他语言也是 ...
- MySQL: 查询出student表中每门课都大于80分的学生姓名
查询出student表中每门课都大于80分的学生姓名 说明(小技能):获取某学生它所有课程的分数最小的一科min(score) > 80 进行分析比较即可, 连分数最小的一科都大于80分,那其他 ...
- 检索每个组中的最后一条记录-MySQL
有一个表messages ,其中包含数据,如下所示: Id Name Other_Columns ------------------------- 1 A A_data_1 2 A A_data_2 ...
- mysql获取删除的条数_如何从mysql表中删除数百万条记录而不会减速
有没有一种很好的方法来删除很多记录而不会减慢网站的速度? 我需要从没有索引和主键的MySQL表中删除数百万条记录.我阅读了SO和网上的各种教程,基本策略是限制删除查询,在删除之间休眠一两秒钟,然后重复 ...
- sql查询从m到n的这几条记录
查询从m到n的这几条记录 m-n go select top (n-m+1) * from stu where id not in (select top (m-1) ID from stu ) -- ...
- 【Mysql】Sql分组查询后取每组的前N条记录
目录 一.背景 二.实战解析 三.总结 一.背景 最近,在开发中遇到个功能需求.系统有个资讯查询模块,要求资讯按照卡片形式展示.如下图: 按照项目组展示卡片,每个项目组展示阅读量最多的TOP2. 需求 ...
- MySQL数据库中如何查询分组后每组中的最后一条记录?
问题描述 比如,在MySQL数据库中,有数据表messages和数据记录,如下: Id Name Other_Columns ------------------------- 1 A A_data_ ...
最新文章
- python tqdm添加进度条
- IIS7.5 HTTP 错误 500.19 - Internal Server Error 问题的解决方案
- join 子查询 效率_MySQL查询在A表不在B表的记录
- tankwar的java坦克子弹撞墙_TankWar 单机(JAVA版)版本2.0.5 坦克撞墙的处理
- php header运用细节
- login组件的两种用法_vue2组件系列第四十节:NoticeBar 通告栏
- WPS中设置一级、二级、三级标题以及正文和目录
- oracle经典分数排名,力扣数据库题目: 分数排名(中等)
- 你知道几种编程思想?
- http和https的区别
- 1-5(中文版)听力积累
- 哈希表解决冲突的方式
- matlab支持 编程语言,用于数学的10个优秀编程语言
- 如何修改mind map pro 的快捷键 how to edit shortcut of mind map pro
- 在线查看相机快门次数_我是亲民_新浪博客
- 【基于可见光定位的智能超市购物车系统】(四)可见光定位、电机驱动与整车设计
- vue 悬浮图标_vue实现可拖拽移动悬浮球
- 踏浪点神:恒指期货交易的基础就是守拙
- Linux命令 ——ipconfig与ifconfig命令用法及区别
- 磁盘损坏造成RMAN备份文件有坏块的恢复案例
热门文章
- 这款电脑升降桌美到我了
- Flink应用实战案例50篇(五)-Apache Flink 在 bilibili 的多元化探索与实践
- linux grep命令 例子,14个grep命令使用例子
- mysql排序两位数_MySQL_Mysql row number()排序函数的用法和注意,虽然使用不多,但是也有情况 - phpStudy...
- 孙叫兽进阶之路之软件测试基础知识
- mysql日活统计函数_如何通过简化日活模型,预估一个产品的日活(DAU)?
- skywalking使用方法_skywalking 6.2配置相关和使用
- mysql 保证事物完整性_数据库高并发请求,如何保证数据完整性?详解MySQL/InnoDB的加锁...
- Do not mutate vuex store state outside mutation handlers.
- 添加jQuery方法解析url查询部分