[英]PostgreSQL calculate rolling average with group and order
我有一張桌子,如下
id | x | y | value
------+--------+-------+------------
1 | 1 | 1 | 25
1 | 1 | 2 | 42
1 | 2 | 3 | 98
1 | 2 | 4 | 54
1 | 3 | 5 | 67
2 | 1 | 1 | 78
2 | 1 | 2 | 45
2 | 2 | 3 | 96
我必須按id將其分組,同時按id,x和y保持順序(按相應順序),並計算前n行的滾動平均值。 例如,如果n = 3
id | x | y | value | rollingAvg
------+--------+-------+--------+-----------
1 | 1 | 1 | 25 | 25
1 | 1 | 2 | 42 | (25 / 1) = 25
1 | 2 | 3 | 98 | (25+42/2) = 33.5
1 | 2 | 4 | 54 | (25+42+98 /3) = 55
1 | 3 | 5 | 67 | (42+98+54 /3) = 64.67
2 | 1 | 1 | 78 | 78
2 | 1 | 2 | 45 | (78/1) = 78
2 | 2 | 3 | 96 | (78+45 / 2) = 61.5
邏輯是
1)如果按id分組時該行是第一行,則該值應為平均值
2)平均值不應包含當前行
提前致謝
我們可以將AVG()
函數與窗口框架一起使用,以僅覆蓋前三行:
select
id,
x,
y,
coalesce(avg(value) over
(partition by id order by y rows between 3 preceding AND 1 preceding), value) as rollingAvg
from your_table
order by id, y;
調用COALESCE()
是必要的,因為您似乎希望如果前三行都為NULL
(這在每個id
組中的第一條記錄中都發生),那么應該使用當前行的value
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.