Chọn giá trị tối đa của mỗi nhóm


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

Bàn của tôi trông giống như thế này. Tôi muốn biết cách chọn giá trị tối đa cho mỗi máy bơm.

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

mã này thực hiện công việc, nhưng tôi nhận được hai mục nhập của Bơm 1 vì nó có hai mục nhập có cùng giá trị.

Câu trả lời:


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

39
Nhưng điều này sẽ không hoạt động trên Postgres hoặc bất kỳ RDBMS nào khác một cách nghiêm ngặt GROUP BY. Nghiêm ngặt, GROUP BYmọi cột trong của bạn SELECTphải xuất hiện trong của bạn GROUP BYhoặc được sử dụng trong một hàm tổng hợp.
NickAb

4
Đúng. "Hoạt động trong MySQL" trong ngữ cảnh này về cơ bản có nghĩa là nó không bị lỗi, không nhất thiết phải trả về kết quả chính xác.
Craig

2
@Craig sai, truy vấn này hoạt động ở tất cả các phiên bản của rdbms và trả về dữ liệu như mong đợi, vì OP không phải sau khi trả về toàn bộ bản ghi với giá trị lớn nhất cho mỗi nhóm, mà muốn giá trị tối đa cho mỗi máy bơm. Danh sách lựa chọn có 2 trường: tên và giá trị. Tên nằm trong nhóm theo mệnh đề và giá trị được tổng hợp qua giá trị tối đa. Tôi không thể thấy bất kỳ phiên bản nào của câu trả lời trong đó sẽ có nhiều trường hơn trong danh sách lựa chọn.
Bóng

3
@Craig nó đã không phải là hành vi mặc định. Nó đã được thay đổi trong v5.7.5, gần 3 năm trước. Nhưng một lần nữa, bạn lại bỏ lỡ điểm: mã trong câu trả lời này tuân thủ tiêu chuẩn sql, do đó nhóm của mysql theo thiết lập là không liên quan.
Shadow

13
@NickAb Tôi có thiếu thứ gì không? Mọi cột đều nằm trong nhóm theo hoặc trong một hàm tổng hợp
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

Lưu ý rằng điều này sẽ dễ dàng hơn nhiều nếu bạn có khóa chính. Đây là một ví dụ

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. Tôi đã làm ví dụ quá đơn giản. Có nhiều cột bảng, mà làm cho nó một chút phức tạp> <.
Wai Wong

Nếu có nhiều cột hơn, chỉ cần thêm chúng vào vùng chọn
m.edmondson

Bạn có thể giải thích về các cột. Bạn đang cố gắng nhóm theo thứ gì?
John Hartsock

@Wai Sai Tôi thấy rằng bạn đã thêm một cột khác nhưng bạn cần giải thích bạn muốn làm gì với cột đó? Bạn có muốn trả về một giá trị từ cột đó không? Bạn có muốn nhóm theo tên và SomeOtherColumn không?
John Hartsock

Đã thêm một cột khác. Tôi muốn nhận giá trị tối đa cho mỗi máy bơm cùng với các giá trị nằm trong hàng của giá trị tối đa từ các cột khác. Tôi có quá khó hiểu không?
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

Đây là ví dụ duy nhất phù hợp với trường hợp của tôi. Tôi có nhiều giá trị cho mỗi 'đăng ký'. Những gì tôi cần là giá trị cuối cùng cho mỗi lần đăng ký, được kết hợp bên ngoài bên trái. Lệnh của id DESCtrên PARTITIONvà bọc truy vấn này trong một LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.idvà hoạt động hoàn hảo.
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

Hãy thử như thế này, Nó hoạt động.


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

điều này sẽ cung cấp cho bạn ý tưởng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.