MySQL通过分组聚合获取每组里面最新的一条记录及其附加信息

MySQL分组聚合获取每组里面最新的一条记录

文章目录


背景

现在有一张学生成绩表 t_score,表结构如下:

CREATE TABLE `t_score`
(
	`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  	`stu_no` varchar(100) NOT NULL COMMENT '学号',
  	`course_no` varchar(100) NOT NULL COMMENT '课程编号',
  	`score` double NOT NULL COMMENT '课程成绩',
  	`create_date` date NOT NULL COMMENT '成绩时间',
  	PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='学生成绩表';

成绩表里面有如下数据:

INSERT INTO `t_score`(`stu_no`, `course_no`, `score`, `create_date`)
VALUES
('s1001', 'c100', 78, '2023-05-10'),
('s1001', 'c100', 88, '2023-07-10'),
('s1001', 'c100', 85, '2023-06-10'),
('s1001', 'c101', 65, '2023-05-10'),
('s1001', 'c101', 70, '2023-06-10'),
('s1001', 'c101', 78, '2023-07-10');

现在有个需求,需要从成绩表里面查询每个学生各门课程最新的成绩时间和对应的成绩

实现

通过分析,可以了解到,为了查询每个学生各门课程最新的成绩时间,需要先通过 group by 对学生编号和课程编号进行分组聚合,同时对成绩时间取最大值(MAX),sql 如下:

SELECT `stu_no`, `course_no`, MAX(`create_date`) `create_date`
FROM `t_score`
GROUP BY `stu_no`, `course_no`;

结果如下:

s1001	c100	2023-07-10
s1001	c101	2023-07-10

到此为止,我们已经通过 group by 知道了每个学生各门课程最新的成绩时间。但需求还需要获取每门课程的成绩信息,因此,我们可以通过将表 t_score 与上述 group by 的结果进行自关联 join 操作,进而获取每个学生各门课程最近成绩所对应的成绩信息,sql 如下:

SELECT s1.`stu_no`, s1.`course_no`, s1.`create_date`, s1.`score`
FROM `t_score` s1
INNER JOIN (
	SELECT `stu_no`, `course_no`, MAX(`create_date`) `create_date`
	FROM `t_score`
	GROUP BY `stu_no`, `course_no`
) s2 ON s1.`stu_no` = s2.`stu_no` AND s1.`course_no` = s2.`course_no` AND s1.`create_date` = s2.`create_date`;

结果如下:

s1001	c100	2023-07-10	88
s1001	c101	2023-07-10	78

总结

好的,以上就是MySQL通过分组聚合获取每组里面最新的一条记录的简单实现。上述实现的思路其实就是先获取最新的成绩时间,接着再通过时间找到对应的成绩信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值