首页 > 数据库 >MySQL数据高阶处理技巧:掌握先排序后分组的智慧

MySQL数据高阶处理技巧:掌握先排序后分组的智慧

时间:2024-05-13 19:30:10浏览次数:16  
标签:T1 查询 分组 MySQL limit 排序 高阶

MySQL数据库的数据探索旅程中,排序和分组是不可或缺的工具。然而,当你面对大量数据、重复值等情况时,常规的处理方法可能显得不够灵活。本文将为你揭示一个精妙的技巧:如何在MySQL中先排序,后分组,从而获取每个类型的最新数据,助你轻松驾驭复杂的数据处理任务。

 

问题背景:先排序,后分组

拥有一张包含活动信息的数据表,其中涵盖活动名称、开始时间、类型等字段。你的任务是,根据开始时间先排序,然后在每个类型中选择最新的那条记录,以获取所有信息。

方法一:子查询(5.7版本)

在子查询中首先对数据进行排序,然后在外部查询中使用分组操作。这样可以保留排序后的顺序,并在分组后选择特定行。

select * from (select * from jsontest order by start_time limit 100000 ) T1 group by type order by type 

这个查询首先将整个表按照开始时间降序排序,然后在外部查询中按类型进行分组,由于已经排序,每个类型中的第一行即为最新的记录。

注意:此处子查询需要添加limit,limit的值可以根据实际情况调整

在5.7版本中会忽略掉子查询中的order by语句,也就是排序被优化掉了,可以通过在子查询中添加limit来显式的限制生成的子查询结果集

方法二:使用窗口函数(8.0版本)

通过使用窗口函数(如 ROW_NUMBER())在内部查询中为每一行分配一个行号,然后在外部查询中筛选行号为1的记录。这样也可以实现先排序后分组的效果。

SELECT T1.*
FROM (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY type ORDER BY start_time desc) AS rn
    FROM jsontest
) T1
WHERE T1.rn = 1;

这个查询在内部查询中使用窗口函数,为每个类型的记录按开始时间降序分配行号,然后在外部查询中选择行号为1的记录,即每个类型的最新记录。

总结

通过这个先排序,后分组的MySQL魔法,你可以轻松地应对需要复杂数据处理的情况。不再为排序和分组的顺序问题而烦恼,让你的数据分析更加高效准确。在实际的数据处理中,根据具体的场景选择适合的方法,将会使你在MySQL的世界里游刃有余。

 

原文地址:https://cloud.tencent.com/developer/article/2317640

标签:T1,查询,分组,MySQL,limit,排序,高阶
From: https://www.cnblogs.com/abel-he/p/18189844

相关文章

  • Docker 部署 Mysql8.1
    #不挂载,直接创建容器[root@VM-24-9-centos~]#dockerrun-d-p3306:3306--namemysql-eMYSQL_ROOT_PASSWORD='123456'mysql获取镜像#拉取镜像[root@VM-24-9-centos~]#dockerpullmysql:8.1创建挂载目录和配置文件#创建挂载目录[root@VM-0-17-centos~]#mkd......
  • mysql视图
    1.介绍  视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。  通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。......
  • inno Setup 打包Java exe可执行文件和MySQL数据库,无需额外配置实现一键傻瓜式安装
    前言出现有需要打包Java应用和Mysql数据库成一个安装包给出去的需求,这里我把整个打包的流程整理一下。环境JDK17;MySQL5.7;流程Jpackage打包EXEJpackage是JDK14后加入的一个用于独立打包的工具,能够将应用打包成exe,有了Jpackage就不需要用exe4j这种打包工具,省去打包的繁......
  • dbeaver连接mysql报错Public Key Retrieval is not allowed
    这个错误通常发生在尝试通过JDBC连接MySQL数据库时,并且是由于MySQL的配置不允许公钥检索导致的。从MySQL5.0开始,连接时默认需要使用密钥进行密码加密传输。如果JDBC驱动程序尝试通过不允许公钥检索的方式进行连接,就会抛出这个错误。解决方法:更新JDBC连接字符串,添加允许公钥检......
  • docker 安装 mysql8
    1、拉镜像dockerpullmysql:8 2、创建数据目录mkdir-p/home/dockerdata/mysql/confmkdir-p/home/dockerdata/mysql/logsmkdir-p/home/dockerdata/mysql/mysql 3、创建配置文件cd/home/dockerdata/mysql/conf/vimy.cnf[client]default-character-set=......
  • Mysql 中的日期时间函数汇总
    日期和时间函数MySQL中内置了大量的日期和时间函数,能够灵活、方便地处理日期和时间数据,本节就简单介绍一下MySQL中内置的日期和时间函数。1CURDATE()函数CURDATE()函数用于返回当前日期,只包含年、月、日部分,格式为YYYY-MM-DD。使用示例如下:mysql>SELECTCURDATE();+------......
  • Mysql事务特性和Mysql事务隔离级别
    事务执行异常处理、提交、回滚:https://www.cnblogs.com/xsj1989/p/17774735.htmlMysql默认的执行引擎是innoDB,支持事务,行级锁定和外键。Mysql事务特性1.原子性:事务是一个不可分割的整体,要么全部成功,要么全部失败。2.一致性:系统从一个正确状态迁移到另一个正确状态。3.隔离性:每个......
  • 分组查询
    语法select分组函数,列(要求出现在groupby的后面)from表【where筛选条件】groupby分组的列表【orderby子句】注意:查询列表必须特殊,要求是分组函数和groupby后出现的字段特点:......
  • MySQL中的FOUND_ROWS()与ROW_COUNT()函数
    参考:https://www.cnblogs.com/JennyYu/p/16888090.htmlFOUND_ROWS():found_rows()用于查询同一连接下,上一条执行select查询返回的行数,包括show语句返回的行数。中间可以插入执行dml语句,返回依然是上一条select语句返回的行数。使用sql_calc_found_rows与found_rows()组合,可以查......
  • MySQL 死锁案例
    记一次MySQL死锁分析处理过程,聊聊我的思路。前车之鉴,后事之师。以一个例子为切入点一、问题背景某业务模块反馈数据库最近出现过几次死锁告警的情况,本文总结了这次死锁排查的全过程,并分析了导致死锁的原因及解决方案。希望给大家提供一个死锁的排查及解决思路。基础环境:......