mysql - Mysql查询按部分获取最大年龄,如果两个或更多具有相同年龄,则返回具有最小ID的学生
问题描述
我有一个临时测试值的学生表,如下所示:
表学生
+----+-------------+-------+-----------+
| id | section_id | age | name |
+----+-------------+-------+-----------+
| 1 | 1 | 18 | Justin |
+----+-------------+-------+-----------+
| 2 | 2 | 14 | Jillian |
+----+-------------+-------+-----------+
| 3 | 2 | 16 | Cherry |
+----+-------------+-------+-----------+
| 4 | 3 | 19 | Ronald |
+----+-------------+-------+-----------+
| 5 | 3 | 21 | Marie |
+----+-------------+-------+-----------+
| 6 | 3 | 21 | Arthur |
+----+-------------+-------+-----------+
我想查询该表,以便获得每个部分的所有最大年龄。但是,如果两个学生的年龄相同,则生成的表将返回 id 最小的学生。
返回:
+----+------------+-----+--------+
| id | section_id | age | name |
+----+------------+-----+--------+
| 1 | 1 | 18 | Justin |
+----+------------+-----+--------+
| 3 | 2 | 16 | Cherry |
+----+------------+-----+--------+
| 5 | 3 | 21 | Marie |
+----+------------+-----+--------+
我试过这个查询:
SELECT ANY_VALUE(id), ANY_VALUE(section_id), MAX(age), ANY_VALUE(name) FROM
(SELECT id, section_id, age, name FROM students ORDER BY id) as X
GROUP BY section_id
不幸的是,有些情况下 id 与年龄和姓名不匹配。
我有:
sql_mode = only_full_group_by
而且我没有编辑它的特权,因此是 any_value 函数,但我不知道如何使用它。
解决方案
这将做你想要的。
它首先查找每个部分的最大年龄(包括重复项)。然后它将这些结果与每个部分的最小 id 连接起来(以消除重复)。最后,为匹配的 id 和 section 组合选择所有字段。
SELECT s3.*
FROM students s3
INNER JOIN (
SELECT MIN(s2.id) AS id, s2.section_id
FROM students s2
INNER JOIN (
SELECT s1.section_id, MAX(s1.age) AS age
FROM students s1
GROUP BY s1.section_id
) s1 USING (section_id, age)
GROUP BY s2.section_id
) s2 USING (id, section_id);
工作 SQL 小提琴:https ://www.db-fiddle.com/f/aezgAYM6A5KnXykceB7At1/0
推荐阅读
- reactjs - 即浏览器 iframe 有 src 源但 body 和 head 是空的
- mysql - 如何在 Mysql 中处理外键约束失败
- c++ - 从右到左 - 在链后递增作为回报
- opencv - EmguCV/OpenCV 图像融合和 GPU (CUDA)
- c - ((char *)&struct) 在 C 中做了什么?
- mongodb - MongoDB 按聚合分组
- python - 如何使用 django 启动 celery 5?
- flutter - Flutter 'owner!._debugCurrentBuildTarget == this': 不正确。#87
- html - Pandas read_html 在 Anaconda Spyder 中花费的时间太长——为什么?
- sql - 从带时间戳的记录转换为 15 分钟的定期记录