0

我有一张桌子

datetime (every 15 mins) | value 

我如何显示平均价值

select  avg( value_15mins_before, value, value_15mins_after )
4

1 回答 1

1

我建议您在表中放置一个自动递增的 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 的子查询中添加约束来解决此问题。. . 例如,仅考虑在给定值 20 分钟内的时间值。

这也假设它value不为空。

于 2012-10-03T18:19:51.657 回答