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。
您可以使用另一个窗口函数(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)
| 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)
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |