今天有个朋友问我:mysql 根据某个id进行分组,每个分组按时间排序取最新的一条记录,除了使用row_number函数,是否还有其他方法?

其实这是个老生常谈的问题了 ,并且会经常出现在各种面试题中,我给了这个朋友几个方案,他几乎没怎么考虑就选了最后一个:

方案1:使用row_number,配合cte写法,具体就是:  with t as (select *,row_number() over (partition by id order by update_time desc) as rn from table )select * from t where id=1
        方案2:先按id分组找到最新的更新时间写到临时表 ,再和原表关联,

CREATE TEMPORARY TABLE tmp_table as select id,max(update_time) as update_time from table group by id;       select * from table a join tmp_table b on a.id=b.id and a.update_time=b.update_time

方案3:使用子查询作为查询条件

select * from table a where a.update_time =(select max(b.update_time ) from table b where b.id=a.id)

方案4:从业务层面优化,在表上加一个字段,isnewdata,bit型或者int型就好,每次在表中提交数据时,事务中先将要提交的数据所涉及的id,将历史数据isnewdata=1的更新为0,新提交的数据,isnewdata为1,然后增加一个索引isnewdata,或者如果需要和其他表关联的时候,增加复合索引,性能一下就上来了。

以上方案中:方案1和方案2中规中矩,是大多数人的选择;方案3性能最差,但是也有一些习惯用子查询的人采用;方案4性能最好,只是需要对业务做一些改进。

如果业务数据量不大,最多就几万条,用方案1,2,3均可。数据量不超过100万行,方案1和2还能勉强顶住。超过100万行,就要从业务层面去优化了,此时选择方案4是明智的

如何分组取最新的数据相关推荐

  1. 分组取最新的一条数据

    ##分组取最新的一条数据,错误 SELECTa.account_balance,a.deposit_amount,a.deposit_time,a.create_user,a.resident_id, ...

  2. mysql分组分批_[Mysql]分组取最新一条

    我有如下这张表的数据,需要根据mobile电话号码分组,每条电话取最新的数据 方案1: SELECT * from (SELECT * from model_online_forecastscore_ ...

  3. 用Python爬取最新股票数据含完整源代码

    用Python爬取最新股票数据含完整源代码 抓取目标: url:http://webapi.cninfo.com.cn/#/marketDataDate 数据目标: 获取 证券代码 证券简称 交易日期 ...

  4. Hive实现将分组取top2的数据进行相减(SQL面试题)

    1.问题描述 一张成绩表class有如下字段,班级ID,英语成绩,数学成绩,语文成绩 id    english   math  chinese classid                     ...

  5. mysql分组取最新时间的数据

    mysql分组后显示最新数据 方法一:NOT EXISTS SELECT         e.GROUP_COLUMN,         e.COMPARE_TIME     FROM        ...

  6. 联合查询分组取最新数据

    场景: sql分组取最大优化 描述 同事今天遇到一个查询,一次有问题,让我帮忙查看,先上数据,有两张浏览表需要取到用户最新的浏览值数据结构如下 表一 CREATE TABLE `ums_member_ ...

  7. mysql 分组之后 取分组之后最新的数据

    一.数据表设计 二.查询场景 统计每门课的考试次数.最新一次考试的时间.最新一次考试的录入成绩的老师 1.统计没门课的考试次数 #考试次数统计 select project '科目',count(pr ...

  8. mysql 分组取最新的一条记录(整条记录)

    方法:mysql取分组后最新的一条记录,下面两种方法.一种是先筛选 出最大和最新的时间,在连表查询.一种是先排序,然后在次分组查询(默认第一条),就是最新的一条数据了 #select * from t ...

  9. mysql子查询 分组,Mysql子查询实现分组取最指定数据的版本差异

    mysql通过group by 分组子查询时,会自动保留最先搜索出来的数据.通过这个特性可以实现想要的结果,比如查询每科目考试第一名的同学成绩.查询每班最后一名到校的学生或者或者每班最先到校的学生.所 ...

最新文章

  1. mysql MDL锁如何解决_MySQL元数据锁MDL
  2. 【java】实现一个简单的正则:判断一个字符串是否全由数字组成
  3. JQ 实现点击按钮显示弹窗,点击非弹窗和按钮区域隐藏弹窗
  4. 独立看门狗---STM32----HAL
  5. 没有varselect这个函数_JavaScript学习笔记(四)-- 函数基础
  6. 03、三种简单的计时器
  7. opencv之求轮廓的凸包
  8. JavaWeb学习 第7章 Session 会话编程
  9. 鼠标屏幕取词技术的原理和实现 (转)
  10. js 使用Rsa 加密 解密
  11. outlook怎么配置126邮箱服务器,126邮箱如何设置Microsoft Outlook的服务器?
  12. github 提交消息的emoji表情符号规范
  13. 免费的.netFramework 混淆工具 Babel obfuscator GUI
  14. iOS-底层原理 19:KVC探索
  15. Stable Diffusion 2.0来了,皮卡智能AI早已“抢先”优化升级
  16. 在线pdf转换成word转换器怎么样
  17. 邮件服务器之Webmail
  18. Markdown文本目录生成、页内跳转
  19. 家庭理财及基金常识了解
  20. 二叉堆简单实现与应用

热门文章

  1. 计算机应用技术题,计算机应用技术复习题.doc
  2. 外服游戏服务器如何显示中文,避免国外服务器出现乱码的办法
  3. python调包师_为“Python调包侠” 画像
  4. 1_22_python基础学习_0518
  5. 【Linux】常用命令:网络、内存、cron 超详细介绍
  6. matlab 去条带噪声,一种图像条带噪声及坏线消除方法
  7. linux 视频壁纸,Plasma video wallpaper: KDE 4 视频壁纸
  8. Md5扩展攻击的原理和应用
  9. TJISE-APP 自动签到打卡
  10. VR智慧家装,给业主带来别样的家装体验!