如何获得包含每个分组集的最大值的行?
我在这个问题上看到过一些过于复杂的变化,没有一个能给出好的答案。我试着把最简单的例子放在一起:
如果有这样一个表,其中有person、group和age列,那么您如何获得每组中最年长的人(一组中的平局应给出第一个按字母顺序排列的结果)
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
17条答案
按热度按时间cczfrluj16#
采用排名法。
这个sql可以用下面的方式来表示,
select*from users,(select@rn:=0)r order by groupa、age desc、person
@上一个grp为空
@rn:=case when@prev\u grp<>groupa then 1 else@rn+1 end
这是一个三运算符表达式
这样,如果prev\u grp!=其他组rn=rn+1
让rn=1过滤掉您需要的行
dced5bon17#
在mysql中有一种非常简单的方法:
这是因为在mysql中不允许聚合非groupby列,在这种情况下mysql只返回第一行。解决方案是首先对数据进行排序,这样对于每个组,您需要的行是第一个,然后按您需要的值所在的列进行分组。
您可以避免使用复杂的子查询来查找
max()
等等,以及当有多行具有相同的最大值时返回多行的问题(其他答案也会这样做)注意:这是一个仅限mysql的解决方案。我所知道的所有其他数据库都会抛出sql语法错误,并显示消息“groupby子句中未列出非聚合列”或类似消息。因为此解决方案使用未记录的行为,所以更谨慎的人可能希望包含一个测试,以Assert如果mysql的未来版本更改此行为,它仍然有效。
版本5.7更新:
从5.7版开始
sql-mode
设置包括ONLY_FULL_GROUP_BY
默认情况下,要使此功能正常工作,必须没有此选项(编辑服务器的选项文件以删除此设置)。