SQL:查找每组的最大记录[重复]

Posted

技术标签:

【中文标题】SQL:查找每组的最大记录[重复]【英文标题】:SQL: Find the max record per group [duplicate] 【发布时间】:2011-02-09 02:12:46 【问题描述】:

可能重复:Retrieving the last record in each group

我有一个表,其中包含三个字段和数据。

姓名 , 顶部 , 总计 猫 , 1 , 10 狗 , 2 , 7 猫 , 3 , 20 马 , 4 , 4 猫 , 5 , 10 狗 , 6 , 9

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

姓名 , 顶部 , 总计 猫 , 3 , 20 马 , 4 , 4 狗 , 6 , 9

我尝试按名称按总顺序分组,但它给出了按结果分组的最高记录。谁能指导我一下?

【问题讨论】:

我想知道这个查询有多少重复项——当然不止一个。请参阅标记为“每组最大 n”的 60 多个问题(对于 n=1 的案例)。 @Jonathan:这是初学者 SQL 问题领域中的“永远的问题”。 SO每天都有一个新鲜的。 【参考方案1】:
select
  Name, Top, Total
from
  sometable
where
  Total = (select max(Total) from sometable i where i.Name = sometable.Name)

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

【讨论】:

您好,先生,感谢您的快速回复。我刚才还创建了一个查询,它给了我完美的结果。这是我的查询 select Name, Top, total from animals where total in(SELECT max(total) FROM animals group by name) group by name 我的问题是,当表包含 2 百万数据?再次感谢您的回复。 哪个效率更高?在您的表上定义适当的索引并尝试一下。除此之外,您的WHERE total in (...) 是错误的。一旦您尝试使用实际数百万条记录,而不仅仅是一手满满的,您会很快看到这一点。 第二个查询可能比第一个更有效,因为第一个查询使用了相关的子查询,在第二个版本中可能会执行多次而不是只执行一次。【参考方案2】:

你可以试试

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

【讨论】:

【参考方案3】:

或者使用 Exists 子句,返回两个表中唯一存在的行

SELECT * from sometable T
where exists
(select 1
from (SELECT nombre, max(total) as total FROM  sometable TT
    GROUP by nombre) TT
where T.name=TT.name
and T.total=TT.total
)

【讨论】:

这将起作用,但需要注意的是,在大型表上使用天真的优化器无法仅执行一次相关的子查询,这会很昂贵。 @Jonathan +1 仅用于在“naïve”中使用变音符号 i。 :-)

以上是关于SQL:查找每组的最大记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 为每组分组的 SQL 结果获取具有最大值的记录[重复]

如何从SQL表中删除不是组的最大值的记录[重复]

Oracle SQL查询:根据时间检索每组的最新值[重复]

MySQL按顺序查找每组最近/最大的记录

获取每组的前 n 个结果 [重复]

获取组的n个最大值[重复]