2014-01-27 2 views
0

Скажем, у меня есть таблица со столбцами временной метки, цены и тикера. Каждое значение временной метки падает на минутную границу, но не все минуты присутствуют в данных. Строков для этих минут нет.Заполнение отсутствующих времен в наборе данных MySQL

Есть ли способ с чистым SQL, чтобы заполнить строку недостающей минуты ценой из следующей строки, которая is заселена?

Улучшение по-прежнему будет состоять только из минут между 9:30 утра EDT и 4:00 вечера по восточному поясному времени включительно для репопуляции таким образом.

+1

Не хватает ли строк? Или строки для всех минут там только с данными, отсутствующими в строке? –

+0

Да, строки отсутствуют, извините за то, что вы не поняли этого. Позвольте мне уточнить вопрос. –

ответ

1

Предполагая, что строки в данных, но не значения, следующий получает предыдущее значение для строки:

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, пока не будут найдены новые строки.

Смежные вопросы