用 PostgresSQL 实现噪音消除功能

问题描述

在我的 Postgressql 数据库中,我有一个包含 id 列和一个整数 value 的表。

这些值包含需要清除的噪声。我想通过将 n (例如 5)连续值传递给函数然后计算它们的中位数(或平均值或类似的东西)来实现。因此,给定值为 4,1,3,4,2,5,6,4 的记录,第一个输出将是前 5 个值的中位数 (4,4),第二个将是前 5 个值的中位数,偏移量为 1 ({{1 }}),然后偏移 2,依此类推。

我想在类似 1,2查询中使用该函数。这对 Postgres 可行吗?还是应该在数据库之外执行此类计算?

解决方法

不幸的是,Postgres 没有使用窗口函数计算运行中值的便捷方法。因此,以下使用横向连接处理平均值和中位数:

select t.*,t2.*
from t cross join lateral
     (select avg(value) as avg_5,percentile_cont(0.5) within group (order by value) as median_5
      from (select t2.*
            from t t2
            where t2.id >= t.id
            order by t2.id asc
            limit 5
           ) t2
     ) t2;

我应该指出,使用窗口函数更简单:

select t.*,avg(value) over (order by id range between current row and 4 following) as avg_5
from t;

Here 是一个 dbfiddle。