问题描述

需求:

查询出每月 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 条记录?相关推荐

  1. 查询出每个分组中的 top n 条记录

    问题描述 需求: 查询出每月 order_amount(订单金额) 排行前3的记录. 例如对于2019-02,查询结果中就应该是这3条: 解决方法 MySQL 5.7 和 MySQL 8.0 有不同的 ...

  2. MySQL数据库中如何查询分组后每组中的最后一条记录

    MySQL数据库中如何查询分组后每组中的最后一条记录 方法一 select * from messages where id in (select max(id)fom messages group ...

  3. SQL分组查询后取每组的前N条记录

    本文由 Leon 同学授权发布 这个公众号的关注者除了大部分是 Android 工程师之外还有部分后端以及前端同学,我鼓励也非常欢迎大家来投稿,其实我们并不需要把自己限定在某个领域,多学学其他语言也是 ...

  4. MySQL: 查询出student表中每门课都大于80分的学生姓名

    查询出student表中每门课都大于80分的学生姓名 说明(小技能):获取某学生它所有课程的分数最小的一科min(score) > 80 进行分析比较即可, 连分数最小的一科都大于80分,那其他 ...

  5. 检索每个组中的最后一条记录-MySQL

    有一个表messages ,其中包含数据,如下所示: Id Name Other_Columns ------------------------- 1 A A_data_1 2 A A_data_2 ...

  6. mysql获取删除的条数_如何从mysql表中删除数百万条记录而不会减速

    有没有一种很好的方法来删除很多记录而不会减慢网站的速度? 我需要从没有索引和主键的MySQL表中删除数百万条记录.我阅读了SO和网上的各种教程,基本策略是限制删除查询,在删除之间休眠一两秒钟,然后重复 ...

  7. 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 ) -- ...

  8. 【Mysql】Sql分组查询后取每组的前N条记录

    目录 一.背景 二.实战解析 三.总结 一.背景 最近,在开发中遇到个功能需求.系统有个资讯查询模块,要求资讯按照卡片形式展示.如下图: 按照项目组展示卡片,每个项目组展示阅读量最多的TOP2. 需求 ...

  9. MySQL数据库中如何查询分组后每组中的最后一条记录?

    问题描述 比如,在MySQL数据库中,有数据表messages和数据记录,如下: Id Name Other_Columns ------------------------- 1 A A_data_ ...

最新文章

  1. python tqdm添加进度条
  2. IIS7.5 HTTP 错误 500.19 - Internal Server Error 问题的解决方案
  3. join 子查询 效率_MySQL查询在A表不在B表的记录
  4. tankwar的java坦克子弹撞墙_TankWar 单机(JAVA版)版本2.0.5 坦克撞墙的处理
  5. php header运用细节
  6. login组件的两种用法_vue2组件系列第四十节:NoticeBar 通告栏
  7. WPS中设置一级、二级、三级标题以及正文和目录
  8. oracle经典分数排名,力扣数据库题目: 分数排名(中等)
  9. 你知道几种编程思想?
  10. http和https的区别
  11. 1-5(中文版)听力积累
  12. 哈希表解决冲突的方式
  13. matlab支持 编程语言,用于数学的10个优秀编程语言
  14. 如何修改mind map pro 的快捷键 how to edit shortcut of mind map pro
  15. 在线查看相机快门次数_我是亲民_新浪博客
  16. 【基于可见光定位的智能超市购物车系统】(四)可见光定位、电机驱动与整车设计
  17. vue 悬浮图标_vue实现可拖拽移动悬浮球
  18. 踏浪点神:恒指期货交易的基础就是守拙
  19. Linux命令 ——ipconfig与ifconfig命令用法及区别
  20. 磁盘损坏造成RMAN备份文件有坏块的恢复案例

热门文章

  1. 这款电脑升降桌美到我了
  2. Flink应用实战案例50篇(五)-Apache Flink 在 bilibili 的多元化探索与实践
  3. linux grep命令 例子,14个grep命令使用例子
  4. mysql排序两位数_MySQL_Mysql row number()排序函数的用法和注意,虽然使用不多,但是也有情况 - phpStudy...
  5. 孙叫兽进阶之路之软件测试基础知识
  6. mysql日活统计函数_如何通过简化日活模型,预估一个产品的日活(DAU)?
  7. skywalking使用方法_skywalking 6.2配置相关和使用
  8. mysql 保证事物完整性_数据库高并发请求,如何保证数据完整性?详解MySQL/InnoDB的加锁...
  9. Do not mutate vuex store state outside mutation handlers.
  10. 添加jQuery方法解析url查询部分