簡體   English   中英

使用滯后函數在SQL中查找移動平均值

[英]Using the lag function to find a moving average in SQL

我需要找到前12行的移動平均線。 我需要讓我的結果集看起來像這樣。

t   Year    Month   Sales   MovingAverage
1   2010      3      20     NULL
2   2010      4      22     NULL
3   2010      5      24     NULL
4   2010      6      25     NULL
5   2010      7      23     NULL
6   2010      8      26     NULL
7   2010      9      28     NULL
8   2010      10     26     NULL
9   2010      11     29     NULL
10  2010      12     27     NULL
11  2011      1      28     NULL
12  2011      2      30     NULL
13  2011      3      27     25.67
14  2011      4      29     26.25
15  2011      5      26     26.83

對於第13行,我需要對行1到12進行平均,並在第13行MovingAverage中返回結果。 第1-12行的MovingAverage為NULL,因為計算時應該至少有12行。 行t,年,月和銷售已存在。 我需要創建MovingAverage行。 我正在使用postgreSQL但語法應該非常相似。

不要使用lag()函數。 移動平均功能有一個版本。 好吧,差不多:

select t.*, avg(sales) over (order by t range between 12 preceding and current row
from table t;

問題是,這將產生前11個月的平均值。 為了防止:

select t.*,
       (case when row_number() over (order by t) >= 12
             then avg(sales) over (order by t range between 12 preceding and current row
        end) as MovingAvg
from table t;

請注意,此查詢range between的語法rows between而不是range between的語法rows between非常相似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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