如何获取包含每个分组集的最大值的行?
我见过这个问题的一些过于复杂的变体,但没有一个有好的答案。我试图整理出最简单的示例:
给定一个如下表,其中包含人员、组和年龄列,您如何获得每个组中年龄最大的人? (组内的平局应给出第一个按字母顺序排列的结果)
Person | Group | Age
---
Bob | 1 | 32
Jill | 1 | 34
Shawn| 1 | 42
Jake | 2 | 29
Paul | 2 | 36
Laura| 2 | 39
期望的结果集:
Shawn | 1 | 42
Laura | 2 | 39
最佳答案
正确的解决方案是:
SELECT o.*
FROM `Persons` o # 'o' from 'oldest person in group'
LEFT JOIN `Persons` b # 'b' from 'bigger age'
ON o.Group = b.Group AND o.Age < b.Age
WHERE b.Age is NULL # bigger age not found
工作原理:
它匹配 o
中的每一行包含 b
中的所有行Group
列中具有相同的值以及列 Age
中更大的值。 o
中的任意行Age
列中没有其组的最大值将匹配 b
中的一行或多行.
LEFT JOIN
使其与组中最年长的人(包括组中单独的人)匹配,行中充满 NULL
来自 b
(“组中没有最大的年龄”)。
使用INNER JOIN
使这些行不匹配并且它们被忽略。
WHERE
子句仅保留具有 NULL
的行从 b
中提取的字段中的 s 。他们是每个组中年龄最大的人。
进一步阅读
书 SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming 中解释了这个解决方案和许多其他解决方案。
关于mysql - 获取每组分组 SQL 结果中最大值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59356713/