2009-08-20 2 views
11

У меня есть эта таблица:Выбор всех соответствующих полей, используя MAX и GROUP BY

alt text

И я хотел бы сделать запрос, который будет возвращать для каждого deal_id строки с наибольшим timestamp, а соответствует status_id.

Так для этого примера, я бы дал 2 строки:

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

Я пытался сделать это с этим запросом

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

но было бы вернуть не status_id:

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

возможно дубликат [Извлечь строку с максимальным значением для столбца] (http://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column) – outis

ответ

14

без единого поля первичного ключа, я думаю, что ваш лучший выбор:

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 

это еще не будет работать, если вы позволяют иметь две различные статусы для того же самого продукта, в то же время

+1

Ваш ответ почти идеален, вам просто нужно поставить 'как ds' вне скобки. – tachfine

0

Привет я надеюсь, что это дает, что и хотят это

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

код, который вы написали, по сути, совпадает с кодом в принятом ответе –