2009-08-20 11 views
11

tengo esta tabla:Selección de todos los campos correspondientes utilizando MAX y GROUP BY

alt text

Y me gustaría hacer una petición que devolvería para cada deal_id la fila con la más alta timestamp, y la correspondiente status_id.

Así que para este ejemplo, habría vuelto 2 filas:

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

yo tratamos de hacerlo con esta consulta

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

pero sería devolver el mal status_id:

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

posible duplicado de [Obtener la fila que tiene el valor Máx. Para una columna] (http://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column) – outis

Respuesta

14

sin un solo campo de clave principal, creo que su mejor opción es:

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 

esto todavía no funcionará si usted permite tener dos estados diferentes para el mismo producto, al mismo tiempo

+1

Su la respuesta es casi perfecta, solo necesitas poner 'como ds' fuera del paréntesis. – tachfine

0

Hola espero que esto da lo que quieres

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

el código que ha escrito es esencialmente el mismo que el código en la respuesta aceptada –