Вы можете использовать два коррелированных подзапроса:
select
t.*,
(
select date
from mytable t1
where t1.itemid = t.itemid and t1.date < t.date
order by t.date desc
limit 1
) previous_date,
(
select info
from mytable t1
where t1.itemid = t.itemid and t1.date < t.date
order by t.date desc
limit 1
) previous_info
from mytable t
Однако это плохо масштабируется, когда вам нужно восстановить больше столбцов из предыдущей записи. В этом случае мы можем самостоятельно объединиться с условием not exists
для фильтрации по предыдущей записи:
select
t.*,
tlag.date previous_date,
tlag.info previous_info
from mytable t
left join mytable tlag
on tlag.itemid = t.itemid
and tlag.date < t.date
and not exists (
select 1
from mytable t1
where t1.itemid = t.itemid and t1.date < t.date and t1.date > tlag.date
)
Для выполнения обоих запросов рассмотрим следующий индекс для (item_id, date)
. Возможно, вы захотите добавить info
к индексу, например: (item_id, date, info)
, особенно с первым запросом, поэтому оба подзапроса покрыты индексом.