我想使用 TimescaleDB 直接从存储在 PostgreSQL-DB 中的数据中删除峰值。
我的数据存储为间隔为 1 秒的值,我想计算 5 分钟的平均值而没有峰值。
我使用标准偏差确定峰值,并排除所有超过固定 zscore 的数据。
因此,在第一步中,我获取与我的分析相关的所有数据(data_filtered),然后计算每个 5 分钟块的平均值和标准偏差(avg_and_stddev_per_interval),然后将初始数据(data_filtered)与计算的 avg 和 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
) 的情况下请求完整数据并在本地计算我的标准要快得多。但是,我想减少数据量,因此在这种情况下这种方法是不可能的。
有什么方法可以加速我的查询?