Pilih nilai maksimal setiap grup

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

Meja saya terlihat seperti ini. Saya ingin tahu cara memilih nilai maksimal untuk setiap 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

kode ini melakukan pekerjaannya, tetapi saya mendapatkan dua entri dari Pump 1 karena memiliki dua entri dengan nilai yang sama.

Wai Wong
sumber

Jawaban:

188
select name, max(value)
from out_pumptable
group by name
m.edmondson
sumber
40
Tetapi ini tidak akan berfungsi pada Postgres atau RDBMS lainnya dengan ketat GROUP BY. Secara ketat, GROUP BYsetiap kolom di Anda SELECTharus muncul di Anda GROUP BYatau digunakan dalam fungsi agregat.
NickAb
4
Baik. "Berfungsi di MySQL" dalam konteks ini pada dasarnya berarti ia tidak macet, bukan berarti mengembalikan hasil yang benar.
Craig
2
@Craig salah, kueri ini bekerja di semua ragam rdbms dan mengembalikan data seperti yang diharapkan, karena OP tidak setelah mengembalikan seluruh rekaman dengan nilai maksimum per grup, tetapi menginginkan nilai maks per pompa. Daftar pilihan memiliki 2 bidang: nama dan nilai. Nama ada di grup menurut klausa dan nilai dikumpulkan melalui maks. Saya tidak dapat melihat versi jawaban mana pun di mana akan ada lebih banyak bidang dalam daftar pilih.
Bayangan
3
@Craig itu adalah bukan perilaku default. Itu diubah di v5.7.5, hampir 3 tahun yang lalu. Tetapi sekali lagi, Anda melewatkan intinya: kode dalam jawaban ini sesuai dengan standar sql, oleh karena itu grup mysql dengan pengaturan tidak relevan.
Bayangan
13
@NickAb Apakah saya melewatkan sesuatu? Setiap kolom adalah baik dalam kelompok oleh atau fungsi agregasi
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

Perhatikan ini akan jauh lebih mudah jika Anda memiliki kunci utama. Ini sebuah Contoh

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
sumber
Ah, sial. Saya membuat contoh terlalu sederhana. Ada lebih banyak kolom di tabel, yang membuatnya sedikit rumit>. <
Wai Wong
Jika ada lebih banyak kolom, tambahkan saja ke dalam seleksi
m.edmondson
Bisakah Anda menguraikan kolomnya. Apa yang ingin Anda kelompokkan?
John Hartsock
@Wai Salah Saya melihat bahwa Anda menambahkan kolom lain tetapi Anda perlu menjelaskan apa yang ingin Anda lakukan dengannya? Apakah Anda ingin mengembalikan nilai dari kolom itu? Apakah Anda ingin mengelompokkan berdasarkan nama dan SomeOtherColumn?
John Hartsock
Menambahkan kolom lain. Saya ingin mendapatkan nilai maksimal untuk setiap pompa bersama dengan nilai yang ada di baris nilai maks dari kolom lain. Apakah saya terlalu membingungkan?
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
twk7890
sumber
Ini adalah satu-satunya contoh yang berhasil untuk kasus saya. Saya memiliki beberapa nilai per 'pendaftaran'. Yang saya butuhkan adalah nilai terakhir untuk setiap pendaftaran, bergabung dengan luar kiri. Diperintahkan oleh id DESCpada PARTITIONdan dibungkus query ini dalam LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.iddan bekerja sempurna.
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

Coba seperti ini, Berhasil.

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

ini akan memberi Anda ide.

Muhammad Jahanzeb
sumber