MySQL分组排序取每组第一条(最大值、最小值)

MySQL分组排序



前言

业务场景:student_score是学生的分数表,其中包含id、学生、科目、创建时间、分数字段,现在我们需要进行平均分、最大分数、最小分数等不同纬度的统计。

运行环境:
MySQL8.0
Java8


一、前期准备

建表语句:

CREATE TABLE `student_score` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `student` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '学生姓名',
  `project` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '科目',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `score` int DEFAULT NULL COMMENT '分数',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `student` (`student`,`project`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

数据准备:
随机生成姓名,依次插入模拟数据
自动生成项目地址


二、统计

1.平均分

select group_concat(distinct student), avg(score) from student_score group by student

在这里插入图片描述

2.计算个人最低分

select group_concat(distinct student), min(score) from student_score group by student

该处使用的url网络请求的数据。

3.计算个人最高分

select group_concat(distinct student), max(score) from student_score group by student

![在这里插入图片描述](https://img-blog.csdnimg.cn/d7d64621e0a84e64b9af0688bc0135aa.png


总结

① 巧妙利用mysql的max、min函数
② 计算所有同学的学科最高分,网上流传最多的是下面的写法:

select * from (select * from student_score order by score desc limit 1000) a group by a.student

这样写有个弊端,limit限制了结果集的数据量,对以后的业务扩展都会有影响

另外:max和min也有弊端,如图project字段并不是该条数据的正确科目(分数与科目不对应):
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值