【问题标题】:SQL: Find the max record per group [duplicate]SQL:查找每组的最大记录[重复]
【发布时间】: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每天都有一个新鲜的。

标签: sql mysql greatest-n-per-group


【解决方案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。 :-)
    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2021-02-01
    相关资源
    最近更新 更多