sql - 在没有足够数据可用的情况下,使用带有前导空值的 SQL 窗口函数计算移动平均值

标签 sql postgresql window-functions

我想使用 SQL 窗口函数计算移动平均线。以下 2“天”移动平均线的示例基本上可以正常工作,但如果只有一个数据点可用,它也会计算平均值。只要没有足够的数据可用,我宁愿平均值为空

create table average(
    nr int,
    value float
);

insert into average values (1, 2), (2, 4), (3, 6), (3, 8), (4, 10);

SELECT
    nr, 
    value, 
    AVG(value) OVER (ORDER BY nr ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING)::FLOAT AS "Moving-Average-2"
FROM average;

结果:

1   2   2
2   4   3
3   6   5
3   8   7
4   10  9

预期结果:

1   2   null
2   4   3
3   6   5
3   8   7
4   10  9

编辑 1: 当然,平均值可以是任何值,而不仅仅是 2。

最佳答案

您可以使用另一个窗口函数 (COUNT()) 来确保在进行计算之前窗口中至少有两条记录可用,例如:

SELECT
    nr, 
    value, 
    CASE WHEN COUNT(*) OVER(ORDER BY nr ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING) > 1
        THEN AVG(value) OVER (ORDER BY nr ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING)::FLOAT 
        ELSE NULL
    END AS "Moving-Average-2"
FROM average;

Demo on DB Fiddle :

| nr  | value | Moving-Average-2 |
| --- | ----- | ---------------- |
| 1   | 2     |                  |
| 2   | 4     | 3                |
| 3   | 6     | 5                |
| 3   | 8     | 7                |
| 4   | 10    | 9                |

关于sql - 在没有足够数据可用的情况下,使用带有前导空值的 SQL 窗口函数计算移动平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55570279/

相关文章:

sql - 在 PostgreSQL 中滚动 12 个月的总和

sql - 如何在 PostgreSQL 中获取每条具有特定属性集的记录之后的第一条记录?

sql - Postgres,将时间戳更新为当前日期但保留一天中的时间

PostgreSQL now() 值不改变函数中的值

sql - 按列分组,选择最新值

mysql - Sql 查询在连接表中搜索多个匹配项

postgresql - 如何修复 postgres 安装 ubuntu 时的错误

sql - PostgreSQL 忽略窗口函数中的 NULLS

SQL 数据透视 : One To Many

sql - 生成 SQL 行