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

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

时间:2023-09-05 18:34:32浏览次数:34  
标签: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的世界里游刃有余。


标签:T1,查询,分组,MySQL,limit,排序,高阶
From: https://blog.51cto.com/xiuji/7378043

相关文章

  • MySQL分页查询详解:优化大数据集的LIMIT和OFFSET
    最近在工作中,我们遇到了一个需求,甲方要求直接从数据库导出一个业务模块中所有使用中的工单信息。为了实现这一目标,我编写了一条SQL查询语句,并请求DBA协助导出数据。尽管工单数量并不多,只有3000多条,但每个工单都包含了大量的信息。DBA进行了多次导出操作,不幸的是,每次尝试导出都导致......
  • MySQL 存储引擎 有几种 都有什么优缺点?
    MySQL常见的三种存储引擎为InnoDB、MyISAM和MEMORY。它们各自有一些优缺点:1.InnoDB存储引擎:优点:-提供了事务管理、回滚、崩溃修复能力、和多版本并发控制的事务安全;-支持外键约束,提高了数据的一致性和完整性;-支持行级锁,提高了并发性能;-支持外键约束,提高了数据的一致性和......
  • Mysql 引擎 InnoDB和MyISAM的区别
    1、InnoDB、MyISAM区别MySQL引擎InnoDB和MyISAM是MySQL中常用的两种存储引擎,它们具有以下不同的特点:InnoDB支持事务,而MyISAM不支持事务。InnoDB支持行级锁定,而MyISAM支持表级锁定。在并发访问的情况下,InnoDB的性能更好。InnoDB支持外键约束,而MyISAM不支持......
  • mysql忘记密码
    mysql-uroot-p一回车想输入密码,发现密码错误!![MySQLforLinux错误ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:YES)]1、找到my.cnf配置文件的位置windows下修改的是my.ini,这里主要说的是Linux的具体操作,Linux系统使用whereis能......
  • MySQL安装--rpm(CentOS7 + MySQL 5.7.35)
    Linux系统-部署-运维系列导航 MySQL常用安装方式有3种:rpm安装、yum安装、二进制文件安装。本文介绍rpm安装方式。 组件安装操作步骤参考 组件安装部署手册模板,根据不同组件的安装目标,部分操作可以省略。本文将按照该参考步骤执行。 一、获取组件可执行程序库,包括主程......
  • 2,mysql的常用查询语句
    一、数据库1,创建数据库createdatabasedatabase_name;数据库的Name的命名一般按照公司规范,例如:createdatabasedb_book;2,查看数据库Showdatabases;3,删除数据库Dropdatabasedatabase_name;例如:Dropdatabasedb_book;二、表结构的增删改1.,创建一个表C......
  • MySQL入门系列2-数据控制语言(DCL)
    一、概念DCL数据控制语言,用来管理数据库用户、控制数据库的访问权限。二、查询用户select*frommysql.user;其中Host代表当前用户访问的主机,如果为localhost,代表只能够在当前本机访问,不可以远程访问的。User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯......
  • 1,mysql基础:mysql的安装,mysql的基本数据类型
    第一章安装1,windows安装https://dev.mysql.com/downloads/mysql/如果是msi的安装包,一步步安装就可以,如果是zip包,解压后需要设置在存在有bin文件夹的同目录新建一个my.ini文件加入一下代码:[mysqld]#设置3306端口port=3306#设置mysql的安装目录basedir=C:\ProgramFi......
  • Qt调用 mysql数据库 QSqlQuery::exec()堵塞
    RT,因为某个字段名称写错了,修改字段语句,语句大致如下altertablet_user_settingchangefield1field2varchar(32)default'11'comment'22'每当执行到query.exec()时,直接堵塞不动,刚好我这里使用workbench查看数据库,在workbench调用同样语句,程序就不堵塞了,每次都是这样。最......
  • Windows下Mysql完全卸载教程
    1,windows系统(快捷键win+r)进入命令行输入:netstopmysql2,进入控制面板,卸载mysql3,进入C:\ProgramFiles(x86),C:\ProgramFiles,C:\ProgramData中,将MySQL文件夹删除4,在注册表中彻底清除mysql的东西快捷键win+r输入regedit进入注册表找到HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Ser......