Выберите самую последнюю строку в MySQL для набора различных ключей - PullRequest
0 голосов
/ 24 мая 2018

У меня есть таблица foo, которая выглядит следующим образом:

+----------+--------------+------+-----+-------------------+----------------+
| Field    | Type         | Null | Key | Default           | Extra          |
+----------+--------------+------+-----+-------------------+----------------+
| id       | int(10)      | NO   | PRI | NULL              | auto_increment |
| ts       | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
| user     | varchar(255) | YES  | MUL | NULL              |                |
| a        | varchar(255) | YES  | MUL | NULL              |                |
| b        | varchar(255) | YES  | MUL | NULL              |                |
| c        | float        | YES  |     | NULL              |                |
+----------+--------------+------+-----+-------------------+----------------+

Для каждого набора отдельных (user, a, b) я хотел бы выбрать самую последнюю временную отметку и значениеc

Я попробовал несколько вариантов из следующих без удачи

select distinct user, b, c, ts as ts_b 
from (select max(ts) as ts_a from foo as max_ts) 
where ts_a = ts_b;

Буду признателен за любую помощь, которую вы можете оказать.Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Я бы использовал подзапрос.Вот один из методов:

select f.*
from foo f
where (user, b, c, ts) in (select user, b, c, max(ts) from foo group by user, b, c);

Это дает вам всю строку.Если вам просто нужна максимальная временная метка, это простая агрегация, используемая в качестве подзапроса.

0 голосов
/ 24 мая 2018

Мне нравится ответ Боба Вейла о выполнении max и group by, но вы упомянули, что вам могут потребоваться другие значения.

Если вам нужны другие значения, связанные со строкой, вы можете использовать оконную функцию, такую ​​как row_number (), чтобы получить строки, которые вы ищете, без нахождения в группе.

select id, ts, user, a, b, c, row_rank
from (
select id, ts, user, a, b, c,
row_number() over (partition by user, b, c order by ts desc) as row_rank
from foo
) table_with_row_number
where table_with_row_number.row_rank = 1
0 голосов
/ 24 мая 2018

Как насчет

select user,b,c, max(ts) as ts_b from foo
group by user,b,c

ОБНОВЛЕНИЕ

Вы можете использовать этот подзапрос, чтобы получить то, что вам нужно.f2 будет строкой foo, которая соответствует различным user, a, b и имеет самый последний ts.Это эквивалентно оператору CROSS APPLY в MSSQL.

select f2.user,f2.a, f2.b,f2.c, f2.ts 
from  
(select distinct user,a, b from foo) f1 
inner join foo f2 
on f2.id = 
(select id
 from foo f3 
 where f3.user=f1.user and f3.a = f1.a and f3.b=f1.b
 order by f3.ts desc
 limit 1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...