0

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)、ローカルで条件を計算する方がはるかに高速です。ただし、データ量を減らしたいので、この場合、このアプローチはできません。

クエリを高速化する方法はありますか?

4

3 に答える 3