【问题标题】:Implementing noise cancellation function with PostgresSQL使用 PostgresQL 实现降噪功能
【发布时间】:2021-02-06 12:34:36
【问题描述】:

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

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

我想在SELECT id, value, noisless_value(value) FROM measurements 这样的查询中使用该函数。这对 Postgres 可行吗?还是应该在数据库之外进行这样的计算?

【问题讨论】:

  • 所以您的示例记录的输出将是 4, 4, 4, 4, 4, 4 ?

标签: sql postgresql noise-reduction


【解决方案1】:

不幸的是,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。

【讨论】:

  • 一个自定义的median aggregate可以用作窗口函数
  • @a_horse_with_no_name 。 . .你知道为什么percentile_() 函数不能吗?在许多其他数据库中,这些只是窗口函数。
  • 不知道。我想和许多其他缺失的东西一样:没有人足够关心来实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多