选择每个组的最大值


87
Name    Value   AnotherColumn
-----------
Pump 1  8000.0  Something1
Pump 1  10000.0 Something2
Pump 1  10000.0 Something3
Pump 2  3043    Something4
Pump 2  4594    Something5
Pump 2  6165    Something6

我的桌子看起来像这样。我想知道如何为每个泵选择最大值。

select a.name, value from out_pumptable as a,
(select name, max(value) as value from out_pumptable where group by posnumber)g where and g.value = value

这段代码可以完成工作,但是我得到了Pump 1的两个条目,因为它有两个具有相同值的条目。

Answers:


182
select name, max(value)
from out_pumptable
group by name

36
但这不适用于Postgres或其他任何带有strict的RDBMS GROUP BY。严格来说GROUP BY,您的每一列都SELECT必须出现在您的表中GROUP BY或在聚合函数中使用。
NickAb 2014年

4
对。在这种情况下,“在MySQL中工作”基本上意味着它不会崩溃,并不意味着它一定会返回正确的结果。
克雷格

2
@Craig错误,此查询适用于所有形式的rdbms,并按预期方式返回数据,因为OP并非在返回具有每组最大值的整个记录​​之后,而是希望每个泵的最大值。选择列表包含2个字段:名称和值。名称在group by子句中,并且值通过max聚合。在选择列表中会有更多字段的地方,我看不到任何答案。
影子

3
@Craig它不是默认的行为。将近3年前在v5.7.5中进行了更改。但是同样,您错过了要点:此答案中的代码符合sql标准,因此mysql的group by设置无关紧要。
阴影

13
@NickAb我错过了什么吗?每一列任一组中的由或聚合函数
罗布

17
SELECT
  b.name,
  MAX(b.value) as MaxValue,
  MAX(b.Anothercolumn) as AnotherColumn
FROM out_pumptabl
INNER JOIN (SELECT 
              name,
              MAX(value) as MaxValue
            FROM out_pumptabl
            GROUP BY Name) a ON 
  a.name = b.name AND a.maxValue = b.value
GROUP BY b.Name

请注意,如果您有主键,这样做会容易得多。这是一个例子

SELECT * FROM out_pumptabl c
WHERE PK in 
    (SELECT
      MAX(PK) as MaxPK
    FROM out_pumptabl b
    INNER JOIN (SELECT 
                  name,
                  MAX(value) as MaxValue
                FROM out_pumptabl
                GROUP BY Name) a ON 
      a.name = b.name AND a.maxValue = b.value) 

啊 我使这个例子太简单了。该表中还有更多列,这使它有点复杂>。<
Wai Wong 2010年

如果还有更多列,请将其添加到选择中
m.edmondson

您能否详细说明一下列。您要分组的是什么?
John Hartsock 2010年

@Wai错误我看到您添加了另一列,但是您需要解释您要使用它吗?您要从该列返回值吗?您要按名称和SomeOtherColumn分组吗?
John Hartsock 2010年

添加了另一列。我想获取每个泵的最大值以及其他列中最大值行中的值。我变得太困惑了吗?
怀皇

16
select name, value 
from( select name, value, ROW_NUMBER() OVER(PARTITION BY name ORDER BY value desc) as rn
from out_pumptable ) as a
where rn = 1

这是适用于我的情况的唯一示例。每个“注册”都有多个值。我需要的是每个注册的最后一个值,即左外连接。订购id DESCPARTITION,并在包裹这个查询LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.id和完美的作品。
lucasarruda

2
select Name, Value, AnotherColumn
from out_pumptable
where Value =
(
  select Max(Value)
  from out_pumptable as f where f.Name=out_pumptable.Name
)
group by Name, Value, AnotherColumn

尝试这样,它有效。



-3
SELECT DISTINCT (t1.ProdId), t1.Quantity FROM Dummy t1 INNER JOIN
       (SELECT ProdId, MAX(Quantity) as MaxQuantity FROM Dummy GROUP BY ProdId) t2
    ON t1.ProdId = t2.ProdId
   AND t1.Quantity = t2.MaxQuantity
 ORDER BY t1.ProdId

这会给你的想法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.