mysql - 获取每组分组 SQL 结果中最大值的记录

标签 mysql sql greatest-n-per-group

如何获取包含每个分组集的最大值的行?

我见过这个问题的一些过于复杂的变体,但没有一个有好的答案。我试图整理出最简单的示例:

给定一个如下表,其中包含人员、组和年龄列,您如何获得每个组中年龄最大的人? (组内的平局应给出第一个按字母顺序排列的结果)

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/

相关文章:

mysql - 长级联 MySQL 查询

mysql - SQL中发现空表时获取数据

SQL 查询以根据条件最多选择 N 条记录

mysql - 我应该使用 Ruby 进行计算,还是应该使用 MySQL 进行计算?

mysql - 将mysql列从INT转换为TIMESTAMP

mysql - 似乎我在 sql 中的 where 语句被忽略了?

mysql - 下面的mysql语句有什么错误?

mysql按分隔正值和负值的数字列排序

python - 如何在SQL LIKE中传递动态值?

mysql - 获取实际一天每小时的第一行