我想使用 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;
| 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/