问题描述
在我的 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。