移动平均:连续计算最后 N 个数据的 AVERAGE

Moving average: Compute AVG with Last N data continuosly

我有一个 table 这样的:

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行之间的平均值。我怎样才能做到这一点?提前致谢

使用 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 - 向前移动 1 行
  • t.Poin - 在没有下一个值时替换最后一行

你可以试试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

重要:

请注意,在您的 table 中 没有隐式顺序 。没有特定的 ORDER BY 结果是随机的!