为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

扬帆大鱼 2019-06-05 11:16:25
获取每组成组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  
查看完整描述

2 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

在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默认情况下,因此要使此工作,必须有此选项(编辑服务器的选项文件以删除此设置)。


查看完整回答
反对 回复 2019-06-05
?
慕容708150

TA贡献1831条经验 获得超4个赞

正确的解决办法是:

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.AgeWHERE b.Age is NULL                 # bigger age not found

它是如何运作的:

中的每一行进行匹配。o的所有行b列中具有相同值的Group在列中有更大的价值Age..任何一排o在列中没有其组的最大值。Age将匹配一行或多行。b.

这个LEFT JOIN使它与组中年龄最大的人(包括在他们组中的独居者)匹配一排满是NULLS___b(“群体中年龄不算大”)。
使用INNER JOIN使这些行不匹配,它们将被忽略。

这个WHERE子句只保留具有NULL在从b..他们是每个群体中最年长的人。

进一步读数

这本书解释了这个解决方案和其他许多问题。SQL反模式:避免数据库编程的缺陷


查看完整回答
反对 回复 2019-06-05
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

您可以连接到一个子查询,该子查询将MAX(Group)Age..这种方法在大多数RDBMS中都是可移植的。

SELECT t1.*FROM yourTable t1INNER JOIN(
    SELECT `Group`, MAX(Age) AS max_age    FROM yourTable    GROUP BY `Group`) t2    ON t1.`Group` = t2.`Group` AND t1.Age = t2.max_age;


查看完整回答
反对 回复 2019-06-05
  • 2 回答
  • 0 关注
  • 1074 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信