2009-08-20 32 views
11

Tôi có bảng này:Chọn tất cả các lĩnh vực tương ứng sử dụng MAX và GROUP BY

alt text

Và tôi muốn thực hiện một yêu cầu rằng sẽ quay trở lại đối với từng deal_id hàng với mức cao nhất timestamp, và tương ứng status_id.

Vì vậy, trong ví dụ này, tôi sẽ trở lại 2 hàng:

1226, 3, 2009-08-18 12:10:25 
1227, 2, 2009-08-17 14:31:25 

Tôi cố gắng để làm điều đó với truy vấn

SELECT deal_id, status_id, max(timestamp) FROM deal_status GROUP BY deal_id 

này nhưng nó sẽ trả lại sai status_id:

1226, 1, 2009-08-18 12:10:25 
1227, 1, 2009-08-17 14:31:25 
+0

thể trùng lặp của [Tìm nạp hàng có giá trị Tối đa cho một cột] (http://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column) – outis

Trả lời

14

không có một trường khóa chính, tôi nghĩ rằng đặt cược tốt nhất của bạn là:

select * from deal_status 
inner join 
    (select deal_id as did, max(timestamp) as ts 
    from deal_status group by deal_id) as ds 
    on deal_status.deal_id = ds.did and deal_status.timestamp = ds.ts 

này vẫn sẽ không hoạt động nếu bạn cho phép có hai trạng thái khác nhau cho cùng một sản phẩm cùng lúc

+1

câu trả lời gần như hoàn hảo, bạn chỉ cần đặt 'như ds' bên ngoài dấu ngoặc đơn. – tachfine

0

Hi tôi hy vọng điều này sẽ cho những gì u muốn nó

select deal_id,status_id, timestamp from deal_status 
inner join 
    (select deal_id as did,max(timestamp) as ts 
    from deal_status group by deal_id )as ds 
    on deal_status.deal_id = ds.did and deal_status.timestamp = ds.ts order by deal_id 
+0

mã bạn đã viết về cơ bản giống với mã trong câu trả lời được chấp nhận –

Các vấn đề liên quan