获取每组分组sql结果的最大值记录

kb5ga3dv  于 2021-06-18  发布在  Mysql
关注(0)|答案(17)|浏览(615)

如何获得包含每个分组集的最大值的行?
我在这个问题上看到过一些过于复杂的变化,没有一个能给出好的答案。我试着把最简单的例子放在一起:
如果有这样一个表,其中有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
r7knjye2

r7knjye216#

采用排名法。

SELECT @rn :=  CASE WHEN @prev_grp <> groupa THEN 1 ELSE @rn+1 END AS rn,  
   @prev_grp :=groupa,
   person,age,groupa  
FROM   users,(SELECT @rn := 0) r        
HAVING rn=1
ORDER  BY groupa,age DESC,person

这个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过滤掉您需要的行

2skhul33

2skhul3317#

您可以针对一个子查询进行联接,该子查询将 MAX(Group) 以及 Age . 这种方法在大多数rdbms中都是可移植的。

SELECT t1.*
FROM yourTable t1
INNER 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;

相关问题