我需要创建一个函数来计算postgresql表中存储的值的移动平均值。
我知道如何使用框架窗口在查询中计算此移动平均值,例如:
select val, avg(val) over (order by... rows between current row and n following)
但是,由于某些原因,我真的需要有一个plpgsql函数来计算这个移动平均值,以便能够查询,例如:
select moving_average_function(val, p) from ....
以p周期为基础获得数据的移动平均值。
这就是我的问题......如何将p值集合传递给函数,以实现这些p值的平均值的计算?....
我们举一个例子:
Table my_data :
| id | val |
|----+-----|
| 1 | 10 |
| 2 | 12 |
| 3 | 8 |
| 4 | 7 |
| 5 | 9 |
| 6 | 8 |
| 7 | 13 |
我想创建将产生以下结果的函数ma_func(value,period):
select id, val, ma_func(val, 3 order by id) from my_date order by id;
| id | val | ma_func |
|----+-----+---------|
| 1 | 10 | 10 | => average(10)
| 2 | 12 | 11 | => average(12, 10)
| 3 | 8 | 10 | => average(8, 12, 10)
| 4 | 7 | 9 | => average(7, 8, 12)
| 5 | 9 | 8 | => average(9, 7, 8)
| 6 | 8 | 8 | => average(8, 9, 7)
| 7 | 13 | 10 | => average(13, 8, 9)
etc, etc...
任何帮助都将不胜感激,因为我现在已经有很长一段时间在这个问题上,并且根本没有进步! 感谢
答案 0 :(得分:0)
我不知道postgre sql和sql server 2012及以上版本:
CREATE TABLE avg1 (
id int,
val int
);
INSERT INTO avg1
VALUES (1, 10);
INSERT INTO avg1
VALUES (2, 12);
INSERT INTO avg1
VALUES (3, 8);
INSERT INTO avg1
VALUES (4, 7);
INSERT INTO avg1
VALUES (5, 9);
INSERT INTO avg1
VALUES (6, 8);
INSERT INTO avg1
VALUES (7, 13);
SELECT
id,
val,
AVG(CAST(val AS decimal(18, 2))) OVER (
ORDER BY id DESC ROWS BETWEEN
CURRENT ROW AND 2 FOLLOWING)
FROM avg1
ORDER BY id
Saravanan