Mysql分组取最新一条记录

news2024/11/13 16:46:54

文章目录

  • Mysql分组取最新一条记录
    • 1. 数据准备
    • 1. 方法1:使用子查询获取每个组的最大时间戳,然后再次查询获取具体记录(如果时间戳是唯一的)
    • 2. 方法2:使用窗口函数(MySQL 8.0+)
    • 3. 方法3:使用LEFT JOIN(如果时间戳是唯一的)
    • 4. 方法4:如果ID是自增长的,并且与时间戳保持一致,则可以直接使用MAX(ID)
    • 5. 总结

Mysql分组取最新一条记录

1. 数据准备

CREATE TABLE records (  
    id INT AUTO_INCREMENT PRIMARY KEY,  
    category_id INT NOT NULL,  
    data VARCHAR(255) NOT NULL,  
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP  
);
-- 插入一些示例数据  
INSERT INTO records (category_id, data) VALUES  
(1, '这是分类1的第一条记录'),  
(2, '分类2的数据'),  
(1, '分类1的另一条记录'),  
(3, '第三条分类的数据'),  
(2, '分类2的更新数据'),  
(1, '分类1的最新记录'),  
(4, '新分类的数据');

1. 方法1:使用子查询获取每个组的最大时间戳,然后再次查询获取具体记录(如果时间戳是唯一的)

假设你有一个表records,其中包含字段id(主键,自增),category_iddatacreated_at(记录创建时间)。

SELECT r1.*
FROM records r1
INNER JOIN (
    SELECT category_id, MAX(created_at) AS latest_created_at
    FROM records
    GROUP BY category_id
) r2 ON r1.category_id = r2.category_id AND r1.created_at = r2.latest_created_at;

这个查询首先在子查询中为每个category_id找到最新的created_at时间,然后主查询将这个时间与原始表中的记录进行匹配,以获取每个分组的最新的完整记录。
弊端:统一分组不能出现created_at相同的情况,否则分组不唯一

2. 方法2:使用窗口函数(MySQL 8.0+)

如果你的MySQL版本是8.0或更高,你可以使用窗口函数来简化查询。

WITH RankedRecords AS (
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY created_at DESC) AS rn
    FROM records
)
SELECT * FROM RankedRecords
WHERE rn = 1;

-- 或
SELECT
  * 
FROM
  ( SELECT *, ROW_NUMBER( ) OVER ( PARTITION BY category_id ORDER BY created_at DESC ) AS rn FROM records ) t 
WHERE
  t.rn =1

这里,ROW_NUMBER()窗口函数为每个category_id分组内的记录分配一个唯一的序号,基于created_at降序排列。因此,每个分组中created_at最新的记录将获得序号1。然后,通过在外层查询中选择序号为1的记录,你可以获取每个分组的最新记录。


弊端:虽然分组是唯一的,但是取的分组不是最新一条记录,任然要求时间戳是唯一

3. 方法3:使用LEFT JOIN(如果时间戳是唯一的)

如果每个category_idcreated_at的组合是唯一的,你可以使用LEFT JOIN来实现:

SELECT r1.*
FROM records r1
LEFT JOIN records r2 
    ON r1.category_id = r2.category_id AND r1.created_at < r2.created_at
WHERE r2.id IS NULL;

这个查询尝试为r1中的每条记录找到同一category_id下但created_at更晚的记录(r2)。如果找不到这样的记录(即r2.id IS NULL),则r1中的记录就是该分组中的最新记录。

4. 方法4:如果ID是自增长的,并且与时间戳保持一致,则可以直接使用MAX(ID)

一般时间和主键id是正向关系,比如id大的插入时间就会比较大,我们可以以id为准来查询

SELECT * from records where id in(select  max(id) from records group by category_id)

-- 或

SELECT
  r.* 
FROM
  records r
  INNER JOIN ( SELECT category_id, max( id ) maxid FROM records GROUP BY category_id ) t ON t.category_id = t.category_id 
  AND r.id = t.maxid


5. 总结

  1. 时间戳唯一的情况下1、2、3方法都能满足要求
  2. 时间戳不唯一的情况下,考虑4方法,需要确认id是不是正向的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2152667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ClickHouse 与 Quickwit 集成实现高效查询

1. 概述 在当今大数据分析领域&#xff0c;ClickHouse 作为一款高性能的列式数据库&#xff0c;以其出色的查询速度和对大规模数据的处理能力&#xff0c;广泛应用于在线分析处理 (OLAP) 场景。ClickHouse 的列式存储和并行计算能力使得它在处理结构化数据查询时极具优势&…

F28335 的外部中断实验

1 外部中断介绍 1.1 外部中断简介 1.2 外部中断相关寄存器 (1)外部中断控制寄存器(XINTnCR) (2)外部 NMI 中断控制寄存器

多模态大模型MiniCPM-V技术学习

目前性价比最高的多模态模型 Minicpm-V-2.6参数8B&#xff0c;int4版本推理显存仅7GB&#xff0c;并且在幻觉数据集上效果好于其他模型&#xff0c;测试下来效果非常好&#xff0c;官方演示里面还给出了手机上端侧运行的图片和视频推理示例 p.s.Qwen2-VL和Minicpm-V-2.6头对头…

从小白到大神:C语言预处理与编译环境的完美指南(上)

从小白到大神&#xff1a;C语言预处理与编译环境的完美指南&#xff08;下&#xff09;-CSDN博客 新鲜出炉~~&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;下篇在这里&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&…

echarts图表刷新

图表制作完成&#xff0c;点击刷新图标&#xff0c;可以刷新。 <div class"full"><div id"funnel" class"normal"></div><div class"refreshs"><div class"titles_pic"><img src"./…

数据飞轮崛起:数据中台真的过时了吗?

一、数据中台的兴起与困境 随着大数据技术的不断发展&#xff0c;我见证了企业数据能力建设的演变。从数据中台的兴起&#xff0c;到如今数据飞轮模式的热议&#xff0c;企业的数据管理理念经历了巨大的变化。起初&#xff0c;数据中台作为解决数据孤岛、打破部门壁垒的“救星…

创新引领未来,Vatee万腾平台助力企业飞跃发展

在日新月异的科技浪潮中&#xff0c;创新已成为推动社会进步和企业发展的核心动力。Vatee万腾平台&#xff0c;作为数字化转型领域的佼佼者&#xff0c;正以其独特的创新理念和强大的技术实力&#xff0c;引领着企业迈向更加辉煌的未来&#xff0c;助力企业实现飞跃式发展。 创…

如何将很多个pdf拼接在一起?很多种PDF拼接的方法

如何将很多个pdf拼接在一起&#xff1f;将多个PDF文件合并不仅能够提升信息的整合性&#xff0c;还能使文件管理更加高效。想象一下&#xff0c;你需要向同事或老师提交一份综合报告&#xff0c;其中包含了多份相关资料。如果每个文件单独存在&#xff0c;查找和传输都会变得繁…

Redis中Hash(哈希)类型的基本操作

文章目录 一、 哈希简介二、常用命令hsethgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloathstrlen 三、命令小结四、哈希内部编码方式五、典型应用场景六、 字符串&#xff0c;序列化&#xff0c;哈希对比 一、 哈希简介 几乎所有的主流编程语言都提供了哈…

(蓝桥杯)STM32G431RBT6(TIM4-PWM)

一、基础配置 这个auto-reload preload是自动重装载值&#xff0c;因为我们想让他每改变一个占空比&#xff0c;至少出现一次周期 Counter Period(Autoreload Regisiter)这个设值为10000&#xff0c;那么就相当于它的周期是10000 脉冲宽度可以设置为占周期的一半&#xff0c;那…

docker部署excalidraw画图工具

0&#xff09;效果 0.1&#xff09;实时协作 0.2&#xff09;导出格式 1&#xff09;docker安装 docker脚本 bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrorsmain/DockerInstallation.sh)docker-compose脚本 curl -L "https://github.com/…

【随手笔记】使用J-LINK读写芯片内存数据

第一种使用JLINK.exe 1. 打开j-link.exe 2.输入【usb】 3. 连接芯片 输入【connect】输入芯片型号【STM32L071RB】输入连接方式 【S】 使用SWD连接方式输入连接速率 【4000】连接成功 4. 输入【&#xff1f;】查看指令提示 5. 读写指令 Mem Mem [<Zone>…

Redis的主从模式、哨兵模式、集群模式

最近学习了一下这三种架构模式&#xff0c;这里记录一下&#xff0c;仅供参考 目录 一、主从架构 1、搭建方式 2、同步原理 3、优化策略&#xff1a; 4、总结&#xff1a; 二、哨兵架构 1、搭建哨兵集群 2、RedisTemplate如何使用哨兵模式 三、分片集群架构 1&#…

JVM面试题-说一下JVM主要组成部分及其作用

总体来说&#xff0c;方法区和堆是所有线程共享的内存区域&#xff1b;而虚拟机栈、本地方法栈和程序计数器的运行是线程私有的内存区域&#xff0c;运行时数据区域就是我们常说的JVM的内存。 类加载子系统&#xff1a;根据给定的全限定名类名(如&#xff1a;java.lang.Object…

【D3.js in Action 3 精译_024】3.4 让 D3 数据适应屏幕(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

AJAX(一)HTTP协议(请求响应报文),AJAX发送请求,请求问题处理

文章目录 一、AJAX二、HTTP协议1. 请求报文2. 响应报文 三、AJAX案例准备1. 安装node2. Express搭建服务器3. 安装nodemon实现自动重启 四、AJAX发送请求1. GET请求2. POST请求(1) 配置请求体(2) 配置请求头 3. 响应JSON数据的两种方式(1) 手动&#xff0c;JSON.parse()(2) 设置…

AI绘画Flux【lora模型】【微缩景观】:惊艳!3D场景融入手机上的微景观!

大家好&#xff0c;我是灵魂画师向阳 今天和大家分享一款基于Flux底模训练的微缩景观模型——FLUX|手机上的微景观。此模型主要将手机作为微型景观的基底&#xff0c;强制将3d情景融入手机并控制在手机屏幕上方范围内。 作者在使用提示词直出和使用该Loar提示词生成的图片进行…

rsyslogd 内存占用很高解决方案

在Kubernetes&#xff08;K8S&#xff09;集群中&#xff0c;监控日志是非常重要的&#xff0c;而rsyslogd是Linux系统中用于处理系统和应用程序日志的守护进程。有时候rsyslogd可能会占用较高的内存&#xff0c;这时候我们就需要对其进行优化和调整。 阿里云虚拟服务器&…

JavaEE: 深入探索TCP网络编程的奇妙世界(二)

文章目录 TCP核心机制TCP核心机制二: 超时重传为啥会丢包?TCP如何对抗丢包?超时重传的时间设定超时时间该如何确定? TCP核心机制 书接上文~ TCP核心机制二: 超时重传 在网络传输中,并不会一帆风顺,而是可能出现"丢包情况"~ 为啥会丢包? 产生丢包的原因有很多…

其他比较条件

使用BETWEEN条件 可以用BETWEEN范围条件显示基于一个值范围的行。指定的范围包含一个下限和一个上限。 示例&#xff1a;查询employees表&#xff0c;薪水在3000-8000之间的雇员ID、名字与薪水。 select employee_id,last_name,salary from employees where salary between 3…