选择每个组的最大值

Wai*_*ong 79 sql

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

m.e*_*son 171

select name, max(value)
from out_pumptable
group by name
Run Code Online (Sandbox Code Playgroud)

  • 但这不适用于Postgres或任何其他严格`GROUP BY`的RDBMS.在严格的`GROUP BY`中,`SELECT`中的每一列必须出现在`GROUP BY`中或用在聚合函数中. (28认同)
  • @NickAb我错过了什么吗?每列*都是*在集合中或在聚合函数中 (10认同)
  • 对.在这种情况下,"在MySQL中工作"基本上意味着它不会崩溃,而不是它必然会返回正确的结果. (3认同)
  • @Craig它**不是默认行为.它差不多3年前在v5.7.5中发生了变化.但是,你再次忽略了这一点:**这个答案中的代码符合sql标准,因此mysql的设置组无关紧要.** (3认同)
  • @Craig错误,此查询适用于所有形式的rdbms,并按预期方式返回数据,因为OP不是在返回具有每组最大值的整个记录​​之后而是希望每个泵的最大值。选择列表具有2个字段:名称和值。名称在group by子句中,并且值通过max聚合。在选择列表中将有更多字段的地方,我看不到任何版本的答案。 (2认同)

Joh*_*ock 13

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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有主键,这将更容易.这是一个例子

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) 
Run Code Online (Sandbox Code Playgroud)


小智 12

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
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一适用于我的案例的示例。我的每个“注册”有多个值。我需要的是每个注册的最后一个值,左外连接。按“PARTITION”上的“id DESC”排序,并将此查询包装在“LEFT OUTER JOIN asgrades ONgrades.enrollment_id = enrollment.id”中,并且运行良好。 (2认同)

小智 7

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
Run Code Online (Sandbox Code Playgroud)

尝试这样,它有效。