2012-10-03 108 views
0

我有一个表MySQL的平均

datetime (every 15 mins) | value 

我怎么能显示

select avg(value_15mins_before, value, value_15mins_after) 
+3

这对我来说毫无意义。你只是想增加/分15分钟到'价值'?请提供更多信息。 – Kermit

+0

请张贴一些样本数据和预期结果。 – Taryn

回答

0

的平均价值,我建议你把一个自动递增的ID在表中。使用时间戳时,事情可能会有一秒之差,这可能会导致问题。

下面将为你身边的每一个点的移动平均:

select (value + coalesce(tprev.value, 0.0) + coalesce(tnext.value, 0.0))/
     ((case when value is not null then 1.0 else 0.0 end) + 
     (case when tprev.value is not null then 1.0 else 0.0 end) + 
     (case when tnext.value is not null then 1.0 else 0.0 end) 
     ) as moving_avg 
from (select t.*, 
      (select max(t2.dt) from t t2 where t2.dt < t.dt) as dt_prev, 
      (select min(t2.dt) from t t2 where t2.dt > t.dt) as dt_next 
     from t 
    ) t left outer join 
    t tprev 
    on t.dt_prev = tprev.dt_prev left outer join 
    t tnext 
    on t.dt_next = tnext.dt_next 

它假定有数据没有“洞”。你可以通过在dt_prev和dt_next的subquerys中加入约束来解决这个问题。 。 。例如,只考虑在给定值的20分钟内的时间值。

这也假定value不为空。