簡體   English   中英

PostgreSQL按組和順序計算滾動平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM