محاسبه میانگین متحرک (moving average) در SQL Server 2012
نویسنده: محمد سلیم آبادی
تاریخ: ۱۳۹۱/۱۱/۱۴ ۱۹:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
CREATE TABLE Samples
(
[date] SMALLDATETIME,
selling SMALLMONEY
);
INSERT Samples
VALUES
('2010-12-01 00:00:00', 10),
('2010-12-02 00:00:00', 12),
('2010-12-03 00:00:00', 13),
('2010-12-04 00:00:00', 16),
('2010-12-05 00:00:00', 19),
('2010-12-06 00:00:00', 23),
('2010-12-07 00:00:00', 26),
('2010-12-08 00:00:00', 27),
('2010-12-09 00:00:00', 20),
('2010-12-10 00:00:00', 18),
('2010-12-11 00:00:00', 19);
SELECT [date],
selling,
CASE WHEN rnk < 4 THEN NULL ELSE mv END AS SimpleMovingAverage
FROM (SELECT *,
AVG(selling) OVER(ORDER BY [date]
ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS mv,
ROW_NUMBER() OVER(ORDER BY [date]) AS rnk
FROM Samples
) AS d;
SELECT S.[date], S.selling, CASE WHEN COUNT(*) < 3 THEN NULL ELSE AVG(s) END AS SimpleMovingAverage
FROM Samples AS S
OUTER APPLY (SELECT TOP(3) selling
FROM Samples
WHERE [date] < S.[date]
ORDER BY [date] DESC) AS D(s)
GROUP BY S.[date], S.selling
ORDER BY S.[date];
select [date],
selling,
(
lag(selling, 1) over(order by [date]) +
lag(selling, 2) over(order by [date]) +
lag(selling, 3) over(order by [date])
) / 3
from Samples;
ممنون از شما. لطفا در صورت امکان راه حل بدون استفاده از توابع window را هم جهت مقایسه ارائه کنید.
با تشکر بسیار
SELECT T0.StockId ,T0.QuoteId ,T0.QuoteDay ,T0.QuoteClose , AVG (T0.QuoteClose) OVER (PARTITION BY T0.StockId ORDER BY T0.QuoteId ROWS 19 PRECEDING) AS MA20 FROM dbo.Quotes AS T0
SELECT StockId, QuoteId, QuoteDay, QuoteClose,
AVG (QuoteClose) OVER (PARTITION BY StockId
ORDER BY QuoteId
ROWS BETWEEN 19 PRECEDING AND CURRENT ROW) AS MA20
FROM dbo.Quotes AS T0;