Предполагая, что строки в данных, но не значения, следующий получает предыдущее значение для строки:
select t.timestamp,
coalesce(value,
(select value
from t t2
where t2.timestamp < t.timestamp and t2.value is not null
order by t2.timestamp desc
limit 1
)
) as value
from t;
Вы можете легко поставить это в обновление:
update t join
(select t.timestamp,
(select value
from t t2
where t2.timestamp < t.timestamp and t2.value is not null
order by t2.timestamp desc
limit 1
) as value
from t
) toupdate
on t.timestamp = toupdate.timestamp
set t.value = toupdate.value;
EDIT:
Если строки отсутствуют, вам необходимо их повторить. Предполагая, что только один отсутствует в строке, то следующий получает значения:
select t.timestamp + interval 1 minute, value
from t left outer
t tnext
on tnext.timestamp = t.timestamp + interval 1 minute;
where tnext.timestamp is null
Вы можете вставить их в insert
:
insert into t(timestamp, value)
select t.timestamp + interval 1 minute, value
from t left outer
t tnext
on tnext.timestamp = t.timestamp + interval 1 minute;
where tnext.timestamp is null;
Для зазоров размером более 1 минуты, я хотел бы предложить просто повторил insert
, пока не будут найдены новые строки.
Не хватает ли строк? Или строки для всех минут там только с данными, отсутствующими в строке? –
Да, строки отсутствуют, извините за то, что вы не поняли этого. Позвольте мне уточнить вопрос. –