2009-08-20 8 views
11

Ho questa tabella:Selezione di tutti i campi corrispondenti utilizzando MAX e GROUP BY

alt text

E vorrei fare una richiesta che sarebbe tornato per ogni deal_id la riga con la più alta timestamp, e la corrispondente status_id.

Così, per questo esempio, avrei restituiti 2 file:

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

ho cercato di farlo con questa query

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

ma sarebbe tornare dalla parte del torto status_id:

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

possibile duplicato [Recupera la riga che ha il valore Max per una colonna] (http://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column) – outis

risposta

14

senza un singolo campo chiave primaria, penso che la vostra migliore scommessa sia:

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 

questo ancora non funziona se si consente di avere due stati diversi per lo stesso prodotto allo stesso tempo

+1

Your la risposta è quasi perfetta, basta mettere il 'come ds' al di fuori della parentesi. – tachfine

0

Ciao Spero che questo dà che u vuole che

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

il codice che hai scritto è essenzialmente lo stesso del codice nella risposta accettata –