在 SQL Server 2012 中计算移动平均线

Posted

技术标签:

【中文标题】在 SQL Server 2012 中计算移动平均线【英文标题】:Calculate Moving Average in SQL Server 2012 【发布时间】:2019-05-21 04:57:27 【问题描述】:

我需要计算移动平均线。

我可以使用 Alteryx 获得此结果,但无法使用 SQL 获得所需的结果。

基本上我已经为周期设置了值。

值可用于 6 个周期,我想使用移动平均值预测下一个值。

例如

Period     Value
01-04-2016 4
01-05-2016 5
01-06-2016 6

对于 01-07-2016 期间,它将是 (4+5+6)/3 = 5

以及下一个值

Period     Value
01-05-2016 5
01-06-2016 6
01-07-2016 5

对于 01-08-2016 期间,它将是 (5+6+5)/3 = 5.33333。

(6+5+5.333)/3 = 5.44444

(5+5.3333+5.4444) = 5.259259

等等。

下表中3个月的预测是预期结果。

CREATE TABLE [dbo].[MovingAvg]
(
    [Period] [date] NULL,
    [Value] [float] NULL,
    [3MonthForecast] [float] NULL
) 

INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-01-01' AS Date),  1, 1)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-02-01' AS Date),  2, 2)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-03-01' AS Date),  3, 3)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-04-01' AS Date),  4, 4)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-05-01' AS Date),  5, 5)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-06-01' AS Date),  6, 6)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-07-01' AS Date), null, 5)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-08-01' AS Date), null, 5.333333333)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-09-01' AS Date), null, 5.444444444)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-10-01' AS Date), null, 5.259259259)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-11-01' AS Date), null, 5.345679012)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2016-12-01' AS Date), null, 5.349794239)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2017-01-01' AS Date), null, 5.31824417)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2017-02-01' AS Date), null, 5.337905807)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2017-03-01' AS Date), null, 5.335314739)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2017-04-01' AS Date), null, 5.330488239)
GO
INSERT [dbo].[MovingAvg] ([Period], [Value], [3MonthForecast]) VALUES (CAST(N'2017-05-01' AS Date), null, 5.334569595)

【问题讨论】:

请回答这个问题? 2016-07-01 开始,[Value] 列是NULL。为什么您会在 3 个月的预测中预期非 NULL 输出? 嗨蒂姆,我有 6 个周期的值和我想使用移动平均预测的下一个值。所以基本上在我的表中我只有期间和值列。 【参考方案1】:

我们可以尝试使用AVG 作为解析函数,并使用适当的窗口获取前面三个记录:

SELECT 
    [Period],
    [Value],
    [3MonthForecast],
    AVG([3MonthForecast]) OVER (ORDER BY [Period] ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS MovingAvgForecast
FROM [dbo].[MovingAvg]
ORDER BY
    [Period];

Demo

【讨论】:

感谢蒂姆的回复。但 3MonthForecast 是预期的结果。我在表中有 Period 和 Value,3MonthForecast 将是计算字段。 @arvindtegampure 如果这解决了您的问题,请告诉我们。 知道如何获得预期的结果吗? 我的回答似乎奏效了。你试过演示吗? 抱歉,如果我的问题一开始不清楚。 3MonthForecast 是预期结果。它是一个计算字段。

以上是关于在 SQL Server 2012 中计算移动平均线的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sql 中的每 n 行(例如第 24、48 和 72 行)计算移动平均值?

在 SQL Server 2008 R2 中计算平均值的窗口函数

SQL 移动平均线

SQL - 计算可变长度的可变移动平均值

在SQL中按组计算移动平均数

永久加权平均成本计算 SQL Server 2008