Calculate moving average using SQL window functions with leading null's where not enough data is avaliable

KIC*_*KIC 5 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;
Run Code Online (Sandbox Code Playgroud)

结果:

1   2   2
2   4   3
3   6   5
3   8   7
4   10  9
Run Code Online (Sandbox Code Playgroud)

预期结果:

1   2   null
2   4   3
3   6   5
3   8   7
4   10  9
Run Code Online (Sandbox Code Playgroud)

编辑1:当然,平均值可以不只是2。

GMB*_*GMB 3

您可以使用另一个窗口函数(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;
Run Code Online (Sandbox Code Playgroud)

DB Fiddle 演示

| nr  | value | Moving-Average-2 |
| --- | ----- | ---------------- |
| 1   | 2     |                  |
| 2   | 4     | 3                |
| 3   | 6     | 5                |
| 3   | 8     | 7                |
| 4   | 10    | 9                |
Run Code Online (Sandbox Code Playgroud)