介绍

一般地, 组内排序取最新数据时,会采用类似这样的写法:

select * from table1 as pmh,( SELECT ponding_id,MAX(create_time) create_timeFROM table1  GROUP BY ponding_id ) as t1where t1.ponding_id = pmh.ponding_id and pmh.create_time = t1.create_time;

这里呢 ,我要介绍另一种方法:

SUBSTRING_INDEX( GROUP_CONCAT( 唯一字段1 ORDER BY 排序字段2 DESC ), ',', 值(取第几个) )

举例:

有一个这样的表:

CREATE TABLE `wisdom_well_cover` (`id` varchar(36) NOT NULL COMMENT '主键',`device_id` varchar(32) DEFAULT NULL COMMENT '设备编号',`device_type` varchar(32) DEFAULT NULL COMMENT '设备类型',`timestamp` datetime DEFAULT NULL COMMENT '接收时间'PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

需求:

查找每个设备的最新数据

select wwc.* from wisdom_well_cover wwc inner join (SELECT SUBSTRING_INDEX ( GROUP_CONCAT( id ORDER BY TIMESTAMP DESC ), ',', 1 ) AS id FROM wisdom_well_cover GROUP BY device_id
) as t1 on wwc.id = t1.id

查找每个设备第二新的数据

select wwc.* from wisdom_well_cover wwc inner join (SELECT SUBSTRING_INDEX (SUBSTRING_INDEX ( GROUP_CONCAT( id ORDER BY TIMESTAMP DESC ), ',', 2 ),',',-1) AS id FROM wisdom_well_cover GROUP BY device_id
) as t1 on wwc.id = t1.id
  1. SUBSTRING_INDEX 字符串截取
  2. GROUP_CONCAT 这个比较奇特 , 可以对分组连接后的字段进行排序,去重等等,
    具体可以自行学习. 连接后的各个字符串是用逗号分割的, 所以用到了字符串截取.

性能对比

这里有一张13万数据的表

表结构如下:

CREATE TABLE `ponding_model_history` (`id` varchar(36) NOT NULL,`create_by` varchar(50) DEFAULT NULL COMMENT '创建人',`create_time` datetime DEFAULT NULL COMMENT '创建日期',`acquisition_time` datetime DEFAULT NULL COMMENT '采集时间',....此处省略其他字段....PRIMARY KEY (`id`) USING BTREE,KEY `acquisition_time_index` (`acquisition_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

用两种方法进行分组排序

  • 第一种 : 用时: 1.349s

    select * from ponding_model_history as pmh,( SELECT ponding_id,MAX(create_time) create_timeFROM ponding_model_history GROUP BY ponding_id ) as t1
    where t1.ponding_id = pmh.ponding_id and pmh.create_time = t1.create_time;
    
  • 第二种 用时: 0.682s

    select * from ponding_model_history as pmh INNER JOIN ( SELECT SUBSTRING_INDEX( GROUP_CONCAT( id ORDER BY create_time DESC ), ',', 1 ) idFROM ponding_model_history GROUP BY ponding_id ) as t1
    on t1.id = pmh.id ;
    

经过验证 结果两种方法结果都无误

【mysql5.7】组内分组排序相关推荐

  1. [转]MySQL实现over partition by(分组后对组内数据排序)

    前言 开发中遇到了这样一个需求:统计商品库存,产品ID + 子产品名称都相同时,可以确定是同一款商品.当商品来自不同的渠道时,我们要统计每个渠道中最大的那一个.如果在Oracle中可以通过分析函数 O ...

  2. mysql 组内分组_[MySQL] group by 分组并进行组内排序取得最新一条

    有一个需求是获取指定用户发送的最新的内容,这个时候需要使用group by分组功能 但是怎么获取最新的呢 ? 如果直接进行order by 是不能实现的,因为MysqL会先执行group by 后执行 ...

  3. datatable的数据进行组内排序_排序算法学习分享(四)希尔排序

    排序,也称为排序算法,可以说是我们学习算法的过程中遇到的第一个门槛,也是实际应用中使用得较为频繁的算法,我将自己对所学的排序算法进行一个归纳总结与分享,如有错误,欢迎指正! 排序算法学习分享(一)选择 ...

  4. 还在用变量去实现多维度分组排序吗?你 out 了!

    作者:Gin 原文来源: https://tidb.net/blog/07531acc 目录 一.什么是窗口函数 二.用窗口函数实现分组内排序 三.基于窗口函数的高效分页批处理方案 一.什么是窗口函数 ...

  5. .sql文件_Mysql分组排序及Sql文件执行

    最近在做一个临时项目,采用的是mysql开发,主要涉及两个问题:1.一个是传参问题:2.另一个是实现对数据分组取前4的数据.个人感觉很有意义,特此记录一下. 一.传参问题 执行mysql文件,需要从外 ...

  6. MYSQL实现分组排序并取组内第一条数据

    一.需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from (sele ...

  7. mysql分组取出每组地一条数据_MYSQL实现分组排序并取组内第一条数据

    一.需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from ( sel ...

  8. group by分组取组内第一条

    正常情况下先将子查询进行排序,然后进行分组便可以取到组内的第一条数据 但是在mysql5.7之后需要在子查询排序的时候加一个limit 举个例子 student表 SELECT * FROM stud ...

  9. Json数组列表中的数据分组排序、组内排序

    文章目录 问题描述 方式一:先全部排序,在分组排序 方式二:使用HashMap取出来分组再组内排序 方式三:使用TreeMap取出来分组再组内排序 测试代码及耗时 问题描述 现在有一个用户信息数组,用 ...

最新文章

  1. 移动网站开发中常用的10段JavaScript代码
  2. 深入理解建造者模式 ——组装复杂的实例
  3. 马斯克超级计算机玩吃鸡,在50亿美元打造的计算机上运行《绝地求生大逃杀》会怎样?...
  4. 【miscellaneous】IP多播技术及其编程
  5. ubantu自启脚本
  6. ubuntu16.04下面用sublime运行scala代码
  7. 65 + iPhone应用程序网站创意设计灵感(上篇)
  8. 软件测试——0319作业
  9. A. Second Order Statistics(sort 水题)
  10. Java I/O体系详细讲解
  11. 字节跳动斩获支付牌照欲建金融帝国,技术实力配得上野心吗?
  12. Node.js跨域请求解决方案
  13. unity 使物体跟随路径点自动移动位置 插值旋转
  14. 用js实现建议绘图板
  15. 【球迷福利】NBA球员数据分析
  16. 北理工计算机学院隋秀峰,吴俊敏(计算机科学与技术学院)老师 - 中国科学技术大学 - 院校大全...
  17. CodeForces-1016C Vasya And The Mushrooms(模拟+思维+前缀和的前缀和) 解题报告 Apare_xzc
  18. 青少年CTF - Web - Flag在哪里 Wp WriteUp
  19. 【ps合成】给男票做个Q版大头像
  20. Matlab基本初等函数大全

热门文章

  1. 来自网页消息do.php意思,PHP网页游戏学习之Xnova(ogame)源码解读(五)
  2. iOS——Charles使用教程移动端
  3. android+6.0钛备份,钛备份Titanium Backup官方下载6.0.1 安卓版
  4. 保研面试 算法题_GitHub - 13538899384/AlgorithmTest: 春招秋招笔试题目汇集
  5. 宝贝不开直通车了会降权吗?如何提升产品权重
  6. Python爬取、分析全球最美Top100女神榜单的数据
  7. jquery myscroll文字上下无缝滚动插件 简单使用
  8. ogg文件怎么转成mp3格式?音频格式快速转换
  9. Java创建简单订房管理程序(附详细代码)
  10. 计算机 算法 ei 论文,计算机算法论文参考文献推荐 计算机算法专著类参考文献哪里找...