Wählen Sie den Maximalwert jeder Gruppe

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

Mein Tisch sieht ungefähr so ​​aus. Ich würde gerne wissen, wie man den Maximalwert für jede Pumpe auswählt.

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

Dieser Code erledigt den Job, aber ich bekomme zwei Einträge von Pump 1, da er zwei Einträge mit demselben Wert hat.

Wai Wong
quelle

Antworten:

181
select name, max(value)
from out_pumptable
group by name
m.edmondson
quelle
35
Dies funktioniert jedoch nicht bei Postgres oder anderen RDBMS mit strengen GROUP BY. Streng genommen muss GROUP BYjede Spalte in Ihrem SELECTentweder in Ihrem erscheinen GROUP BYoder in einer Aggregatfunktion verwendet werden.
NickAb
4
Richtig. "Funktioniert in MySQL" bedeutet in diesem Zusammenhang im Grunde, dass es nicht abstürzt und nicht unbedingt das richtige Ergebnis zurückgibt.
Craig
2
@Craig falsch, diese Abfrage funktioniert in allen Varianten von rdbms und gibt die Daten wie erwartet zurück, da das OP nicht nach Rückgabe des gesamten Datensatzes mit dem Maximalwert pro Gruppe war, sondern den Maximalwert pro Pumpe wollte. Die Auswahlliste enthält 2 Felder: Name und Wert. Der Name befindet sich in der Klausel group by und der Wert wird über max. Ich kann keine Version der Antwort sehen, in der mehr Felder in der Auswahlliste enthalten wären.
Schatten
3
@Craig es war nicht das Standardverhalten. Es wurde in v5.7.5 vor fast 3 Jahren geändert. Aber auch hier verpassen Sie den Punkt: Der Code in dieser Antwort entspricht dem SQL-Standard, daher ist die Gruppe von MySQL nach Einstellung irrelevant.
Schatten
13
@NickAb Vermisse ich etwas? Jede Spalte ist entweder in der Gruppe von oder in einer Aggregationsfunktion
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

Beachten Sie, dass dies viel einfacher wäre, wenn Sie einen Primärschlüssel hätten. Hier ist ein Beispiel

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
quelle
Ah, verdammt. Ich habe das Beispiel zu einfach gemacht. Es gibt mehr Spalten der Tabelle, die es ein wenig kompliziert machen> <.
Wai Wong
Wenn es mehr Spalten gibt, fügen Sie sie einfach in die Auswahl ein
m.edmondson
Können Sie die Spalten näher erläutern? Nach was versuchst du zu gruppieren?
John Hartsock
@Wai Falsch Ich sehe, dass Sie eine weitere Spalte hinzugefügt haben, aber Sie müssen erklären, was Sie damit machen möchten? Möchten Sie einen Wert aus dieser Spalte zurückgeben? Möchten Sie nach Namen und SomeOtherColumn gruppieren?
John Hartsock
Eine weitere Spalte wurde hinzugefügt. Ich möchte den Maximalwert für jede Pumpe zusammen mit den Werten in der Zeile des Maximalwerts aus den anderen Spalten erhalten. Werde ich zu verwirrend
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
quelle
Dies ist das einzige Beispiel, das für meinen Fall funktioniert. Ich habe mehrere Werte pro 'Registrierung'. Was ich brauche, ist der letzte Wert für jede Einschreibung, links außen verbunden. Bestellt von id DESCauf PARTITIONund wickelte diese Abfrage in ein LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.idund funktioniert einwandfrei.
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

Versuchen Sie es so, es funktioniert.

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

Dies wird Ihnen die Idee geben.

Muhammad Jahanzeb
quelle