sql中如何取重复的数据中时间最近的一条

您所在的位置:网站首页 mysql查询两条数据 sql中如何取重复的数据中时间最近的一条

sql中如何取重复的数据中时间最近的一条

2024-07-16 19:25| 来源: 网络整理| 查看: 265

目录 前言一、数据准备1. 表结构2. 表数据 二、实现方式1.SQL模板2.SQL实现3.执行结果

前言 数据库有重复的数据时,我们有时候需要取出时间最近的一条,来满足业务场景。 下面介绍一下通过sql是怎么实现的。 一、数据准备 1. 表结构 CREATE TABLE `t_iov_help_feedback` ( `ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `USER_ID` INT(255) DEFAULT NULL COMMENT '用户ID', `problems` VARCHAR(255) DEFAULT NULL COMMENT '问题描述', `last_updated_date` DATETIME DEFAULT NULL COMMENT '最后更新时间', PRIMARY KEY (`ID`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; 2. 表数据 INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (1, 1, '时间比较小', '2021-02-23 10:11:49'); INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (2, 2, '时间小', '2021-02-23 10:12:49'); INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (3, 3, '我乱写的', '2021-02-23 11:19:19'); INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (4, 1, '时间比较大', '2021-02-23 11:16:01'); INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (5, 2, '时间大', '2021-02-23 11:19:13');

​​在这里插入图片描述 可以看到,USER_ID为1和2都有重复数据。

USER_ID为1 时间最大的条记录为 2021-02-23 11:16:01,USER_ID为2 时间最大的条记录为 2021-02-23 11:19:13。

我们希望找到时间最大的这两条记录。

二、实现方式 1.SQL模板 SELECT t1.重复列, t1.时间列, t1.其余列 FROM 表 t1 INNER JOIN ( SELECT t2.重复列, max( t2.时间列 ) AS 时间列 FROM 表 t2 GROUP BY t2.重复列 ) AS t3 ON t1.重复列 = t3.重复列 AND t1.时间列 = t3.时间列 GROUP BY t1.重复列

思想: 1)先把该表进行 group by 分组,并查询出每组最大的时间列,得到一个子表。 2)再将原本的表和子表通过重复列和时间列关联起来; 这样查询出来的数据,都是以原表数据为准的,得到了时间最大的记录的所有字段信息。 3)但是如果最近的时间不止一条记录,那么就会出现重复,所以在外层还需要对原表进行group by去重。

2.SQL实现

1)mysql 5.7.5 以下版本sql实现:

-- mysql 5.7.5 以下版本 SELECT t1.USER_ID, t1.last_updated_date, t1.ID, t1.problems FROM t_iov_help_feedback t1 INNER JOIN ( SELECT t2.USER_ID, max( t2.last_updated_date ) AS last_updated_date FROM t_iov_help_feedback t2 GROUP BY t2.USER_ID ) AS t3 ON t1.USER_ID = t3.USER_ID AND t1.last_updated_date = t3.last_updated_date GROUP BY t1.USER_ID;

2)mysql 5.7.5 及以上版本 sql实现:

-- mysql 5.7.5 及以上版本 SELECT t1.USER_ID, ANY_VALUE(t1.last_updated_date) as last_updated_date, ANY_VALUE(t1.ID) as ID, ANY_VALUE(t1.problems) as problems FROM t_iov_help_feedback t1 INNER JOIN ( SELECT t2.USER_ID, max( t2.last_updated_date ) AS last_updated_date FROM t_iov_help_feedback t2 GROUP BY t2.USER_ID ) AS t3 ON t1.USER_ID = t3.USER_ID AND t1.last_updated_date = t3.last_updated_date GROUP BY t1.USER_ID;

为什么高版本和低版本的sql语句不一样?

这是因为mysql 版本高于5.7.5时,默认设置的 sql_mode 模式是:only_full_group_by。如果没有去除这个默认模式,又使用上述低版本的group by语句,会报以下错误: 在这里插入图片描述 mysql高版本,对报错字段(非group by字段)加了ANY_VALUE()函数可以规避这个问题。 tips:ANY_VALUE()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据。

如果想了解这个错误详情,可以看我的另外篇文章: MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决

3.执行结果

1)mysql 5.7.5 以下版本执行结果: 在这里插入图片描述 2)mysql 5.7.5 及以上版本执行结果: 在这里插入图片描述 可以看到,USER_ID为1和2的两条记录,都是取的时间比较近的那条数据。 这样,就达到想要的效果啦~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3