MySQL выбрать последнюю метку времени в группе
У меня есть таблица, для которой я хотел бы выбрать самую последнюю отметку времени в категории, определяемой значением определенного столбца в таблице.
конкретно
SELECT *
FROM takelist
WHERE producer_name = 'sean'
AND bucket_id = '2CCEx15_1o'
результаты в
+-------------+---------------+------------+---------------------+
| takelist_id | producer_name | bucket_id | ts |
+-------------+---------------+------------+---------------------+
| 1 | sean | 2CCEx15_1o | 2013-10-07 18:29:00 |
| 4 | sean | 2CCEx15_1o | 2013-10-07 18:33:09 |
| 5 | sean | 2CCEx15_1o | 2013-10-07 18:33:38 |
| 27 | sean | 2CCEx15_1o | 2013-10-07 18:37:38 |
| 212 | sean | 2CCEx15_1o | 2013-10-14 18:36:05 |
| 236 | sean | 2CCEx15_1o | 2013-10-21 17:59:56 |
| 237 | sean | 2CCEx15_1o | 2013-10-21 18:00:55 |
| 281 | sean | 2CCEx15_1o | 2013-10-29 15:58:40 |
| 287 | sean | 2CCEx15_1o | 2013-10-29 19:24:15 |
| 330 | sean | 2CCEx15_1o | 2013-10-31 14:39:33 |
| 615 | sean | 2CCEx15_1o | 2013-12-16 22:46:59 |
| 616 | sean | 2CCEx15_1o | 2013-12-16 22:54:46 |
+-------------+---------------+------------+---------------------+
Я хотел бы выбрать одну строку для каждого уникального значения столбца с именем bucke t_id, где выбранная строка имеет самую последнюю метку времени.
Я пробовал ниже на основе предыдущих ответов на аналогичный вопрос, но, должно быть, что-то не так
SELECT takes.* FROM takelist as takes
INNER JOIN (
SELECT takelist_id, max(ts) max_ts, bucket_id
FROM takelist
WHERE producer_name='sean'
GROUP BY bucket_id
) latest_take
ON takes.takelist_id=latest_take.takelist_id
AND takes.ts=latest_take.max_ts
2 ответа
Ваш запрос близок. Но вы используете идентификатор вместо отметки времени:
SELECT takes.*
FROM takelist takes INNER JOIN
(SELECT max(ts) as max_ts, bucket_id
FROM takelist
WHERE producer_name = 'sean'
GROUP BY bucket_id
) latest_take
ON takes.ts = latest_take.max_ts and takes.bucket_id = latest_take.bucket_id;
Произвольный takelist_id
выбран в оригинальной формулировке. И это может быть не тот, который вы хотите.
Попробуй это:
SELECT t.*
FROM takelist AS t
INNER JOIN (SELECT MAX(ts) max_ts, bucket_id
FROM takelist WHERE producer_name='sean'
GROUP BY bucket_id
) lt ON t.bucket_id=lt.bucket_id AND t.ts=lt.max_ts;
ИЛИ ЖЕ
SELECT *
FROM (SELECT * FROM takelist WHERE producer_name='sean' ORDER BY bucket_id, ts DESC) A
GROUP BY bucket_id