TimescaleDB を使用して、PostgreSQL-DB に格納されているデータから直接スパイクを除去したいと考えています。
私のデータは 1 秒間隔の値として保存されています。スパイクなしで計算された 5 分間の平均値を取得したいと考えています。
標準偏差を使用してスパイクを決定し、一定の zscore よりも離れたすべてのデータを除外します。
したがって、最初のステップでは、分析に関連するすべてのデータ (data_filtered) を取得し、5 分間のチャンクごとに平均と標準偏差を計算し (avg_and_stddev_per_interval)、初期データ (data_filtered) を計算された平均と stddev に結合します。基準を満たさないすべての値を除外し、最終的にスパイクのない最終的な 5 分間の平均を計算します。
with data_filtered as (
select ts, value
from schema.table
where some_criteria = 42
and ts >= '2018-11-12 10:00:00'
and ts < '2018-11-13 10:00:00'
),
avg_and_stddev_per_interval as (
select time_bucket('5 minutes', ts) as five_min,
avg(value) as avg_value,
stddev(value) as stddev_value,
from data_filtered
group by five_min
)
select
time_bucket('5 minutes', ts) as tb,
avg(value) as value,
from data_filtered
left join avg_and_stddev_per_interval
on data_filtered.ts >= avg_and_stddev_per_interval.five_min
and data_filtered.ts < avg_and_stddev_per_interval.five_min + interval '5 minutes'
where abs((value-avg_value)/stddev_value) < 1
group by tb;
それはすべてうまくいきますが、信じられないほど遅いです。グループ化せずに完全なデータを要求し ( select * from data_filtered
)、ローカルで条件を計算する方がはるかに高速です。ただし、データ量を減らしたいので、この場合、このアプローチはできません。
クエリを高速化する方法はありますか?