เลือกค่าสูงสุดของแต่ละกลุ่ม


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

ตารางของฉันมีลักษณะประมาณนี้ ฉันต้องการทราบวิธีการเลือกค่าสูงสุดสำหรับแต่ละปั๊ม

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

รหัสนี้ใช้งานได้ แต่ฉันได้รับ 2 รายการของ Pump 1 เนื่องจากมีสองรายการที่มีค่าเดียวกัน

คำตอบ:


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

40
แต่นี้จะไม่ทำงานใน Postgres หรือ RDBMS อื่น ๆ GROUP BYที่มีอย่างเข้มงวด อย่างเคร่งครัดGROUP BYทุกคอลัมน์ในคุณSELECTจะต้องปรากฏในของคุณGROUP BYหรือใช้ในฟังก์ชันรวม
NickAb

4
ขวา. "ใช้งานได้ใน MySQL" ในบริบทนี้โดยทั่วไปหมายความว่าจะไม่เกิดข้อผิดพลาดไม่ใช่ว่าจะส่งคืนผลลัพธ์ที่ถูกต้อง
Craig

2
@ Craig ผิดคิวรีนี้ใช้งานได้ในทุกรสชาติของ rdbms และส่งคืนข้อมูลตามที่คาดไว้เนื่องจาก OP ไม่ได้ส่งคืนระเบียนทั้งหมดด้วยค่าสูงสุดต่อกลุ่ม แต่ต้องการค่าสูงสุดต่อปั๊ม รายการเลือกมี 2 ฟิลด์: ชื่อและค่า ชื่ออยู่ในกลุ่มตามอนุประโยคและค่าจะรวมผ่าน max ฉันไม่เห็นคำตอบในเวอร์ชันใดที่จะมีฟิลด์เพิ่มเติมในรายการเลือก
เงา

3
@Craig มันก็ไม่ได้ทำงานเริ่มต้น มีการเปลี่ยนแปลงใน v5.7.5 เมื่อเกือบ 3 ปีที่แล้ว แต่อีกครั้งคุณพลาดประเด็น: รหัสในคำตอบนี้สอดคล้องกับมาตรฐาน sql ดังนั้นกลุ่มของ mysql โดยการตั้งค่าจึงไม่เกี่ยวข้อง
เงา

13
@NickAb ฉันขาดอะไรไปหรือเปล่า? ทุกคอลัมน์อยู่ในกลุ่มตามหรือในฟังก์ชันการรวม
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

โปรดทราบว่าสิ่งนี้จะง่ายกว่ามากหากคุณมีคีย์หลัก นี่คือตัวอย่าง

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) 

อาดัง ฉันทำให้ตัวอย่างง่ายเกินไป มีคอลัมน์เพิ่มเติมในตารางซึ่งทำให้ซับซ้อนเล็กน้อย>. <
ไหว้วง

หากมีคอลัมน์เพิ่มเติมเพียงแค่เพิ่มคอลัมน์เหล่านี้ลงในรายการที่เลือก
m.edmondson

คุณสามารถอธิบายรายละเอียดเกี่ยวกับคอลัมน์ คุณกำลังพยายามจัดกลุ่มตามอะไร
John Hartsock

@Wai Wrong ฉันเห็นว่าคุณเพิ่มคอลัมน์อื่น แต่คุณต้องอธิบายว่าคุณต้องการทำอะไร? คุณต้องการส่งคืนค่าจากคอลัมน์นั้นหรือไม่? คุณต้องการจัดกลุ่มตามชื่อและ SomeOtherColumn หรือไม่?
John Hartsock

เพิ่มคอลัมน์อื่น ฉันต้องการรับค่าสูงสุดสำหรับแต่ละปั๊มพร้อมกับค่าที่อยู่ในแถวค่าสูงสุดจากคอลัมน์อื่น ๆ ฉันสับสนเกินไปหรือเปล่า?
ไหว้วง

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

นี่เป็นเพียงตัวอย่างเดียวที่ใช้ได้กับกรณีของฉัน ฉันมีหลายค่าต่อ 'การลงทะเบียน' สิ่งที่ฉันต้องการคือค่าสุดท้ายสำหรับการลงทะเบียนแต่ละครั้งเข้าร่วมด้านนอกซ้าย ได้รับคำสั่งจากid DESCในPARTITIONและห่อแบบสอบถามนี้ในLEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.idและทำงานได้อย่างสมบูรณ์
lucasarruda



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.