2010-12-22 45 views
57
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 tabla se parece a esto. Me gustaría saber cómo seleccionar el valor máximo para cada bomba.Seleccione el valor máximo de cada grupo

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

Respuesta

6
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 

Nota 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) 
+0

Ah, dang. Hice el ejemplo demasiado simple. Hay más columnas en la tabla, que lo hacen un poco complicado>. < –

+0

Si hay más columnas solo agréguelas en la selección –

+0

¿Puede elaborar las columnas? ¿Qué estás tratando de agrupar? –

130
select name, max(value) 
from out_pumptable 
group by name 
+7

Alguna razón para el downvote (¿casi 2 años después?) –

+21

Pero esto no funcionará en Postgres ni en ningún otro RDBMS con el estricto 'GROUP BY '. En el estricto 'GROUP BY 'cada columna en su' SELECT' debe aparecer en su 'GROUP BY' o ser utilizada en una función agregada. – NickAb

+1

Lo que significa que básicamente funciona con MySQL y, bueno, con MySQL ... – Craig

-2
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 le dará la idea.

1
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 
Cuestiones relacionadas