私はテーブルを持っています
datetime (every 15 mins) | value
の平均値を表示する方法
select avg( value_15mins_before, value, value_15mins_after )
テーブルに自動インクリメント 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
これもnullではないことを前提としています。