移动平均线:连续计算前N个数据的AVG

时间:2017-06-21 07:32:49

标签: sql sql-server tsql window-functions moving-average

我有一张这样的表:

Name       Poin
================
ANA         5
ANA         10
ANA         3
ANA         8
ANA         7
ANA         5

我希望像以下一样连续获得最后2行的AVG:

Name       Poin    AVG 2
=========================
ANA         5       7.5
ANA         10      6.5 
ANA         3       5.5
ANA         8       7.5
ANA         7        6
ANA         5        5

“AVG 2”列是行和行-1之间的平均值。我怎样才能做到这一点?提前致谢

2 个答案:

答案 0 :(得分:2)

您可以尝试windowing function with OVER()

DECLARE @table TABLE (Id int, Name nvarchar(10), Poin float)

INSERT INTO @table 
VALUES
(1, N'ANA',5),
(2, N'ANA',10),
(3, N'ANA',3),
(4, N'ANA',8),
(5, N'ANA',7),
(6, N'ANA',5);

SELECT AVG(Poin) OVER(PARTITION BY Name 
                      ORDER BY Id 
                      ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)
FROM @table;

结果

7,5
6,5
5,5
7,5
6
5

重要

请注意,您的表格中有无隐含订单。没有特定的ORDER BY,结果是随机的!

答案 1 :(得分:0)

使用LEAD功能,您可以获得按Id排序的下一行:

DECLARE @table TABLE (Id int, Name nvarchar(10), Poin float)

INSERT INTO @table 
VALUES
(1, N'ANA',5),
(2, N'ANA',10),
(3, N'ANA',3),
(4, N'ANA',8),
(5, N'ANA',7),
(6, N'ANA',5)


SELECT
    t.Id,
    (t.Poin + LEAD(t.Poin, 1, t.Poin) OVER (ORDER BY t.Id)) / 2
FROM @table AS t

LEAD(t.Poin, 1, t.Poin)

  • LEAD - 获取下一个第N行
  • t.Poin - 列
  • 1 - 前进一行
  • t.Poin - 当没有下一个值时替换最后一行