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
的记录,所以我的结果应该是这样的:
我尝试按名称按总顺序分组,但它给出了按结果分组的最高记录。谁能指导我一下?
【问题讨论】:
我想知道这个查询有多少重复项——当然不止一个。请参阅标记为“每组最大 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) FROManimals
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:查找每组的最大记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章