group by分组后获得每组中时间最大的那条记录

用途:

GROUP BY 语句用于 对一个或多个列对结果集进行分组。

例子:

原表:

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;

现在,我们希望根据USER_ID 字段进行分组,那么,可使用 GROUP BY 语句。

我们使用下列 SQL 语句:

SELECT ID,USER_ID,problems,last_updated_date
 FROM t_iov_help_feedback
 GROUP BY USER_ID;

结果集类似这样:

可以看到上面的,结果的确是根据 USER_ID 进行分组了,但是返回的记录是 USER_ID 对应的每组 中最小的那条记录。也就是ID最小的那条。

现在我想分组后得到,last_updated_date 最大的那条记录。这怎么实现呢?

很简单,直接查询的表默认是以 ID 进行顺序排序的,因为分组的时候取的是每组中的第一条。所以只需要 使查询的表 按照 last_updated_date 倒叙排序就行了。

实现的SQL如下,这里使用了嵌套查询。

SELECT ID,USER_ID,problems,last_updated_date 
FROM  (select * from t_iov_help_feedback  order by USER_ID, LAST_UPDATED_DATE DESC) b 
GROUP BY b.USER_ID;

其中:select * from t_iov_help_feedback  order by USER_ID, LAST_UPDATED_DATE DESC 就相当于一个按照USER_ID升序, last_updated_date倒叙排序的表了。

 

查询结果如下:

现在取的就是每组中时间最大的那条记录了。

 

备注:

当遇到两个不同的表时,可以使用以下SQL:

select a.title, t.name, t.price from a 
inner join (select * from b order by id, price ) t on t.id = a.b_id 
group by a.b_id;

 


由于评论区讨论比较激烈,所以2021年我追加了下面的内容~

注意:

上述方案是基于mysql 版本5.5.40实现的,在高版本的mysql不一定可以

1、语法问题

SELECT ID,USER_ID,problems,last_updated_date  FROM table_X  GROUP BY b.USER_ID;   这样的语句在mysql 5.7 版本及以上是不通过的,

报错如下:

这是因为mysql 版本高于5.7.5时,默认设置的 sql_mode 模式是:only_full_group_by。这种情况怎么解决见我的另外篇文章:

MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决

2、效果问题

高版本的mysql,就算跳过了语法检查,执行的效果还是没有的,没有得到时间最新的那条数据。

在8.0.16的mysql版本中举个例子:

表中所有数据如下

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

执行上述语句结果为:

对于UER_ID重复数据,可以看到,分组后没有得到时间较大的那一条记录。

这时,怎么办呢?请见我的另外一篇文章:

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

 

  • 13
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 92
    评论
groupby是一种数据处理的方法,它可以将数据按照某一列或多列的值进行分组。当使用groupby分组后,我们可以通过不同的方法来获得记录。 首先,我们可以使用get_group()方法来获取指定组的记录。get_group()方法接受一个组的标签作为输入,然后返回该组的所有记录。例如,如果我们按照性别将数据分组,可以使用get_group('男')来获取所有性别为男的记录。 此外,我们还可以使用apply()方法来对每个组应用某个函数,并获得函数处理后的结果。apply()方法将对每个组进行迭代,然后将每个组的记录作为参数传递给指定的函数。我们可以在函数进行一些数据处理、计算或其他操作,并将其结果返回。这样,我们就可以获得每个组的记录的处理结果。 另一种方法是使用agg()方法,该方法可以对每个组应用多个函数,并返回函数处理后的结果。我们可以通过传递一个包含多个函数的列表给agg()方法,这样每个函数都将对每个组的记录进行处理,并返回处理结果。 总之,通过使用groupby分组后,可以使用get_group()方法来获取指定组的记录,使用apply()方法对每个组应用某个函数并获取处理结果,还可以使用agg()方法对每个组应用多个函数并返回处理结果。这些方法可以帮助我们在分组获得记录,实现更加灵活的数据处理和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 92
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值