Postgresql函数计算移动平均线

时间:2017-12-14 08:21:24

标签: sql postgresql

我需要创建一个函数来计算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...

任何帮助都将不胜感激,因为我现在已经有很长一段时间在这个问题上,并且根本没有进步! 感谢

1 个答案:

答案 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