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これもnullではないことを前提としています。

于 2012-10-03T18:19:51.657 に答える