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