2014-01-27 52 views
0

假設我有一個包含時間戳,價格和股票行列的表。每個時間戳值落在一個分鐘邊界上,但並非所有分鐘都存在於數據中。這些分鐘的行不存在。在MySQL數據集中填充缺失的時間

是否存在純SQL方式來填充缺少分鐘的行,並填充的下一行的價格?

改進之處還在於,美國東部時間早上9點半至美國東部時間下午4點之間的分鐘數將會以這種方式重新填充。

+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; 

編輯:

如果行丟失,那麼你需要複製它們。假設只是一個連續丟失,那麼下面得到的值:

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直到找不到新行。