2009-08-20 4 views
11

Je cette table:Sélection de tous les champs correspondants en utilisant MAX et GROUP BY

alt text

Je voudrais faire une demande qui reviendrait pour chaque deal_id la ligne avec le plus haut timestamp, et correspondant status_id.

Donc, pour cet exemple, je suis revenu 2 lignes:

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

j'ai essayé de le faire avec cette requête

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

mais retourneraient le mauvais status_id:

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

double possible [Récupère la ligne qui a la valeur Max pour une colonne] (http://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column) – outis

Répondre

14

sans un seul champ de clé primaire, je pense que votre meilleur pari est:

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 

ce ne fonctionne toujours pas si vous PERMETTENT avoir deux statuts différents pour le même produit en même temps

+1

Votre la réponse est presque parfaite, il suffit de mettre le 'as ds' en dehors de la parenthèse. – tachfine

0

Salut J'espère que cela donne ce que tu veux qu'il

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

le code que vous avez écrit est essentiellement le même que le code dans la réponse acceptée –