使用滞后函数在 SQL 中查找移动平均线

Posted

技术标签:

【中文标题】使用滞后函数在 SQL 中查找移动平均线【英文标题】:Using the lag function to find a moving average in SQL 【发布时间】:2014-06-03 17:52:12 【问题描述】:

我需要找到前 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、Year、Month 和 Sales 已经存在。我需要创建 MovingAverage 行。我正在使用 postgreSQL,但语法应该非常相似。

【问题讨论】:

【参考方案1】:

不要使用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;

请注意,此查询的语法 rows between 而不是 range between 将非常相似。

【讨论】:

除了第二个,您还可以:select t.*, avg(sales) over (order by t range between 12 preceding and 1 preceding) as MovingAvg from table t; @SunnyPatel 。 . .如果没有 12 个值,则 OP 明确希望值为 NULL。这就是为什么这个答案使用case 表达式。

以上是关于使用滞后函数在 SQL 中查找移动平均线的主要内容,如果未能解决你的问题,请参考以下文章

使用 sql 查询计算特定的移动平均线

R中的累积和、移动平均线和SQL“分组依据”等价物

SQL 移动平均线

熊猫移动平均线[重复]

Oracle SQL 查询移动平均线

面板数据sql移动平均线