В MySQL 8.x вы можете использовать оконную функцию ROW_NUMBER()
для фильтрации связанных строк.
Например:
select loc_id, asset, timestamp
from (
select
l.id as loc_id,
l.asset,
l.timestamp,
row_number() over(partition by l.asset order by s.timestamp desc) as rn
from locations l
join status s on s.asset = l.asset and s.timestamp <= l.timestamp
) x
where rn = 1
whiteatom Редактировать: Ради будущих читателей - это работает. Мне просто нужно было изменить раздел на (который перезапускает нумерацию; работает как группа по). Как только я изменил его на «разбиение по l.asset, l.timestamp», он перезапустил нумерацию для каждой новой временной отметки позиции, и все строки с номером 1 были правильными.
Рабочий пример:
select loc_id, lts, asset, location, status
from (
select
l.id as loc_id,
l.asset,
l.timestamp as lts,
l.location,
s.status,
row_number() over(partition by l.asset, l.timestamp order by s.timestamp desc) as rn
from location l
join status s on s.asset = l.asset and s.timestamp <= l.timestamp
) x
where rn = 1