Seleziona il valore massimo di ogni gruppo


94
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

Il mio tavolo assomiglia a questo. Vorrei sapere come selezionare il valore massimo per ogni pompa.

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

questo codice fa il lavoro, ma ottengo due voci della pompa 1 poiché ha due voci con lo stesso valore.

Risposte:


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

40
Ma questo non funzionerà su Postgres o qualsiasi altro RDBMS con strict GROUP BY. In rigoroso GROUP BYogni colonna in your SELECTdeve apparire in your GROUP BYo essere utilizzata in una funzione aggregata.
NickAb

4
Destra. "Funziona in MySQL" in questo contesto significa fondamentalmente che non si blocca, non che restituisce necessariamente il risultato corretto.
Craig

2
@ Craig ha sbagliato, questa query funziona in tutti i gusti di rdbms e restituisce i dati come previsto, poiché l'OP non era dopo aver restituito l'intero record con il valore massimo per gruppo, ma voleva il valore massimo per pompa. L'elenco di selezione ha 2 campi: nome e valore. Il nome è nella clausola group by e il valore viene aggregato tramite max. Non riesco a vedere alcuna versione della risposta in cui ci sarebbero stati più campi nell'elenco di selezione.
Shadow

3
@ Craig non era il comportamento predefinito. È stato modificato nella v5.7.5, quasi 3 anni fa. Ma ancora una volta, ti manca il punto: il codice in questa risposta è conforme allo standard sql, quindi l'impostazione del gruppo di mysql è irrilevante.
Shadow

13
@ NickAb Mi sto perdendo qualcosa? Ogni colonna è nel gruppo o in una funzione di aggregazione
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

Nota che sarebbe molto più semplice se avessi una chiave primaria. Ecco un esempio

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) 

Ah, dang. Ho reso l'esempio troppo semplice. Ci sono più colonne nella tabella, il che la rende un po 'complicata>. <
Wai Wong

Se ci sono più colonne, aggiungile alla selezione
m.edmondson

Puoi approfondire le colonne. Per cosa stai cercando di raggruppare?
John Hartsock

@Wai Sbagliato vedo che hai aggiunto un'altra colonna ma devi spiegare cosa vuoi farci? Vuoi restituire un valore da quella colonna? Vuoi raggruppare per nome e SomeOtherColumn?
John Hartsock

Aggiunta un'altra colonna. Voglio ottenere il valore massimo per ciascuna pompa insieme ai valori che si trovano nella riga del valore massimo dalle altre colonne. Sto diventando troppo confuso?
Wai Wong

17
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

Questo è l'unico esempio che funziona per il mio caso. Ho più valori per "registrazione". Quello di cui ho bisogno è l'ultimo valore per ogni registrazione, esterno unito a sinistra. Ordinato da id DESCsu PARTITIONe racchiuso questa query in una LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.ide funziona perfettamente.
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

Prova in questo modo, funziona.


1
select * from (select * from table order by value desc limit 999999999) v group by v.name

-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

questo ti darà l'idea.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.