获取每组成组SQL结果的最大值记录

获取每组成组SQL结果的最大值记录

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


我在这个问题上见过一些过于复杂的变体,但没有一个能给出一个很好的答案。我试着把最简单的例子放在一起:


假设下面有这样一个表,包括Person、Group和Aage列,那么您如何在每个组中得到年龄最大的人呢?(组内的平分应给出第一个字母结果)


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  


扬帆大鱼
浏览 1119回答 2
2回答

POPMUISE

在MySQL中有一种非常简单的方法可以做到这一点:select * from (select * from mytable order by `Group`, age desc, Person) xgroup by `Group`这是因为在MySQL中你可以不聚合非组按列,在这种情况下,MySQL只返回第一划(船)。解决方案是首先对数据进行排序,这样,对于每个组,您想要的行首先是第一个,然后按您想要的值的列进行分组。避免复杂的子查询,这些子查询试图查找max()等等,以及当有多个具有相同最大值的行时(与其他答案相同)时返回多行的问题。注:这是一个只使用MySQL解决办法。我知道的所有其他数据库都会抛出一个SQL语法错误,消息是“非聚合列不在GROUP BY子句中列出”或类似的。因为此解决方案使用无证行为时,越谨慎的人可能会想要包含一个测试来断言它。遗骸MySQL的未来版本应该会改变这种行为。5.7版本更新:自5.7版起,sql-mode设置包括ONLY_FULL_GROUP_BY默认情况下,因此要使此工作,必须不有此选项(编辑服务器的选项文件以删除此设置)。

慕容708150

正确的解决办法是:SELECT&nbsp;o.*FROM&nbsp;`Persons`&nbsp;o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;'o'&nbsp;from&nbsp;'oldest&nbsp;person&nbsp;in&nbsp;group' &nbsp;&nbsp;LEFT&nbsp;JOIN&nbsp;`Persons`&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;'b'&nbsp;from&nbsp;'bigger&nbsp;age' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ON&nbsp;o.Group&nbsp;=&nbsp;b.Group&nbsp;AND&nbsp;o.Age&nbsp;<&nbsp;b.AgeWHERE&nbsp;b.Age&nbsp;is&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;bigger&nbsp;age&nbsp;not&nbsp;found它是如何运作的:中的每一行进行匹配。o的所有行b列中具有相同值的Group在列中有更大的价值Age..任何一排o在列中没有其组的最大值。Age将匹配一行或多行。b.这个LEFT JOIN使它与组中年龄最大的人(包括在他们组中的独居者)匹配一排满是NULLS___b(“群体中年龄不算大”)。使用INNER JOIN使这些行不匹配,它们将被忽略。这个WHERE子句只保留具有NULL在从b..他们是每个群体中最年长的人。进一步读数这本书解释了这个解决方案和其他许多问题。SQL反模式:避免数据库编程的缺陷

紫衣仙女

您可以连接到一个子查询,该子查询将MAX(Group)和Age..这种方法在大多数RDBMS中都是可移植的。SELECT&nbsp;t1.*FROM&nbsp;yourTable&nbsp;t1INNER&nbsp;JOIN( &nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;`Group`,&nbsp;MAX(Age)&nbsp;AS&nbsp;max_age&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;yourTable&nbsp;&nbsp;&nbsp;&nbsp;GROUP&nbsp;BY&nbsp;`Group`)&nbsp;t2&nbsp;&nbsp;&nbsp;&nbsp;ON&nbsp;t1.`Group`&nbsp;=&nbsp;t2.`Group`&nbsp;AND&nbsp;t1.Age&nbsp;=&nbsp;t2.max_age;
打开App,查看更多内容
随时随地看视频慕课网APP