Her grubun maksimum değerini seçin


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

Masam böyle bir şeye benziyor. Her pompa için maksimum değeri nasıl seçeceğimi bilmek istiyorum.

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

bu kod işi yapıyor, ancak aynı değere sahip iki girişi olduğu için Pompa 1'den iki giriş alıyorum.

Yanıtlar:


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

40
Ancak bu, Postgres veya diğer RDBMS'ler üzerinde kesinlikle çalışmayacaktır GROUP BY. Sıkı olarak GROUP BYsizin her sütun SELECTşırası ya Gözlerinde farklı görünebilir GROUP BYveya bir toplama işlevi kullanılmalıdır.
NickAb

4
Sağ. Bu bağlamda "MySQL'de Çalışır", temelde çökmediği anlamına gelir, mutlaka doğru sonucu döndürdüğü anlamına gelmez.
Craig

2
@Craig yanlış, bu sorgu tüm rdbms çeşitlerinde çalışır ve verileri beklendiği gibi döndürür, çünkü OP grup başına maksimum değerle tüm kaydı döndürdükten sonra değil, pompa başına maksimum değeri istemiştir. Seçim listesinde 2 alan vardır: ad ve değer. Ad, cümleciğe göre gruptadır ve değer, maks. Seçim listesinde daha fazla alanın olduğu herhangi bir cevabın versiyonunu göremiyorum.
Shadow

3
O @Craig oldu varsayılan davranış değil. Neredeyse 3 yıl önce v5.7.5'te değiştirildi. Ama yine, noktayı kaçırıyorsunuz: Bu cevaptaki kod sql standardına uyuyor, bu nedenle mysql'nin ayarlayarak grubu alakasız.
Shadow

13
@NickAb Bir şey mi kaçırıyorum? Her sütun olduğu ya da bir agregasyon fonksiyonu grubunda ya da
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

Birincil anahtarınız varsa bunun çok daha kolay olacağını unutmayın. İşte bir örnek

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, kahretsin. Örneği çok basit yaptım. Tabloyu biraz karmaşık hale getiren daha fazla sütun var>. <
Wai Wong

Daha fazla sütun varsa, bunları
seçime

Sütunları detaylandırır mısınız? Neye göre gruplandırmaya çalışıyorsunuz?
John Hartsock

@Wai Yanlış bir sütun daha eklediğinizi görüyorum ama bununla ne yapmak istediğinizi açıklamanız mı gerekiyor? O sütundan bir değer döndürmek istiyor musunuz? Ada ve SomeOtherColumn'a göre gruplamak istiyor musunuz?
John Hartsock

Başka bir sütun eklendi. Her pompa için maksimum değeri, diğer sütunlardan maksimum değer satırındaki değerlerle birlikte almak istiyorum. Çok mu kafa karıştırıyorum?
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

Bu benim durumum için işe yarayan tek örnek. 'Kayıt' başına birden çok değerim var. İhtiyacım olan şey, her kayıt için dışta birleştirilmiş bırakılan son değerdir. Tarafından sipariş id DESCüzerine PARTITIONve bu sorguyu sarılmış LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.idve mükemmel çalışıyor.
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

Böyle dene, işe yarıyor.


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

bu size fikir verecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.