SQL:查找每组的最大记录数

use*_*088 23 mysql sql greatest-n-per-group

可能重复:
检索每个组中的最后一条记录

我有一个表,它有三个字段和数据.

Name  , Top , Total
cat   ,   1 ,    10
dog   ,   2 ,     7
cat   ,   3 ,    20
horse ,   4 ,     4
cat   ,   5 ,    10
dog   ,   6 ,     9

我想选择Total每个值最高的记录Name,所以我的结果应该是这样的:

Name  , Top , Total
cat   ,   3 ,    20
horse ,   4 ,     4
Dog   ,   6 ,     9

按名称顺序尝试了小组,但是按照结果给了小组的最高记录.有人可以指导我吗?

Tom*_*lak 31

select
  Name, Top, Total
from
  sometable
where
  Total = (select max(Total) from sometable i where i.Name = sometable.Name)
Run Code Online (Sandbox Code Playgroud)

要么

select
  Name, Top, Total
from
  sometable
  inner join (
    select max(Total) Total, Name
    from sometable
    group by Name
  ) as max on max.Name = sometable.Name and max.Total = sometable.Total
Run Code Online (Sandbox Code Playgroud)

  • 哪个更有效率?在表上定义适当的索引并尝试一下。除此之外,您的“(...) 中的总计”是错误的。一旦您尝试使用“实际”数百万条记录,而不仅仅是一手资料,您很快就会看到这一点。 (2认同)
  • 第二个查询可能比第一个查询更有效,因为第一个查询使用可能多次执行的相关子查询,而不是在第二个版本中执行一次. (2认同)

Adr*_*der 5

你可以尝试类似的东西

SELECT  s.*
FROM    sometable s INNER JOIN
        (
            SELECT  Name,
                    MAX(Total) MTotal
            FROM    sometable
            GROUP BY Name
        ) sMax  ON  s.Name = sMax.Name 
                AND s.Total = sMax.MTotal
Run Code Online (Sandbox Code Playgroud)