Seleccione el valor máximo de cada grupo

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

Mi mesa se parece a esto. Me gustaría saber cómo seleccionar el valor máximo para cada bomba.

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

este código hace el trabajo, pero obtengo dos entradas de la Bomba 1 ya que tiene dos entradas con el mismo valor.

Wai Wong
fuente

Respuestas:

183
select name, max(value)
from out_pumptable
group by name
m.edmondson
fuente
39
Pero esto no funcionará en Postgres ni en ningún otro RDBMS con estricto GROUP BY. En estricto, GROUP BYtodas las columnas de su SELECTdeben aparecer en su GROUP BYo usarse en una función agregada.
NickAb
4
Derecha. "Funciona en MySQL" en este contexto básicamente significa que no falla, no que necesariamente devuelva el resultado correcto.
Craig
2
@Craig incorrecto, esta consulta funciona en todos los tipos de rdbms y devuelve los datos como se esperaba, ya que el OP no fue después de devolver el registro completo con el valor máximo por grupo, sino que quería el valor máximo por bomba. La lista de selección tiene 2 campos: nombre y valor. El nombre está en la cláusula group by y el valor se agrega mediante max. No puedo ver ninguna versión de la respuesta en la que hubiera más campos en la lista de selección.
Shadow
3
@Craig no era el comportamiento predeterminado. Fue cambiado en v5.7.5, hace casi 3 años. Pero de nuevo, se pierde el punto: el código en esta respuesta cumple con el estándar sql, por lo tanto, el grupo de mysql por configuración es irrelevante.
Shadow
13
@NickAb ¿Me estoy perdiendo algo? Cada columna está en el grupo por o en una función de agregación
Rob
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

Tenga en cuenta que esto sería mucho más fácil si tuviera una clave principal. Aquí hay un ejemplo

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) 
John Hartsock
fuente
Ah, maldición. Hice el ejemplo demasiado simple. Hay más columnas en la tabla, lo que lo hace un poco complicado>. <
Wai Wong
Si hay más columnas, simplemente agréguelas a la selección
m.edmondson
¿Puede ampliar las columnas? ¿Por qué intentas agrupar?
John Hartsock
@Wai Wrong Veo que agregaste otra columna pero necesitas explicar lo que quieres hacer con ella. ¿Quieres devolver un valor de esa columna? ¿Quieres agrupar por nombre y SomeOtherColumn?
John Hartsock
Añadida otra columna. Quiero obtener el valor máximo para cada bomba junto con los valores que están en la fila del valor máximo de las otras columnas. ¿Me estoy volviendo demasiado confuso?
Wai Wong
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
twk7890
fuente
Este es el único ejemplo que funciona para mi caso. Tengo varios valores por "inscripción". Lo que necesito es el último valor de cada inscripción, el exterior izquierdo unido. Ordenado por id DESCel PARTITIONy envuelto esta consulta en un LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.idy funciona perfectamente.
lucasarruda
3
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

Intente así, funciona.

Lilit Galstyan
fuente
1
select * from (select * from table order by value desc limit 999999999) v group by v.name
Umair Sheikh
fuente
-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

esto te dará la idea.

Muhammad Jahanzeb
fuente