Выбор всех соответствующих полей с помощью MAX и GROUP BY - PullRequest
12 голосов
/ 20 августа 2009

У меня есть эта таблица:

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

Ответы [ 2 ]

15 голосов
/ 20 августа 2009

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

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

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

0 голосов
/ 21 августа 2009

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

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
...