SQL Select语句用于计算运行平均列

HYP*_*HYP 7 t-sql sql-server aggregate sql-server-2008

我试图在SELECT语句中有一个基于同一SELECT语句中n个前一行的列的运行平均列.我需要的平均值基于结果集中的前n行.

让我解释

Id        Number       Average
 1             1          NULL
 2             3          NULL
 3             2          NULL
 4             4             2 <----- Average of (1, 3, 2),Numbers from previous 3 rows
 5             6             3 <----- Average of (3, 2, 4),Numbers from previous 3 rows
 .             .             .
 .             .             .
Run Code Online (Sandbox Code Playgroud)

Average列的前3行为null,因为之前没有行."平均值"列中的第4行显示前3行中"数字"列的平均值.

我需要一些帮助来尝试构建一个将执行此操作的SQL Select语句.

Aar*_*ton 11

这应该这样做:

--Test Data
CREATE TABLE    RowsToAverage
    (
    ID int NOT NULL,
    Number int NOT NULL
    )

INSERT  RowsToAverage(ID, Number)
SELECT  1, 1
UNION ALL
SELECT  2, 3
UNION ALL
SELECT  3, 2
UNION ALL
SELECT  4, 4
UNION ALL
SELECT  5, 6
UNION ALL
SELECT  6, 8
UNION ALL
SELECT  7, 10

--The query
;WITH   NumberedRows
AS
(
SELECT  rta.*, row_number() OVER (ORDER BY rta.ID ASC) AS RowNumber
FROM    RowsToAverage rta
)

SELECT  nr.ID, nr.Number,
        CASE
            WHEN nr.RowNumber <=3 THEN NULL
            ELSE (  SELECT  avg(Number) 
                    FROM    NumberedRows 
                    WHERE   RowNumber < nr.RowNumber
                    AND     RowNumber >= nr.RowNumber - 3
                )
        END AS MovingAverage
FROM    NumberedRows nr
Run Code Online (Sandbox Code Playgroud)


ich*_*ban 8

假设Id列是顺序的,这里是一个名为"MyTable"的表的简化查询:

SELECT 
    b.Id,
    b.Number,
    (
      SELECT 
       AVG(a.Number) 
      FROM 
       MyTable a 
     WHERE 
       a.id >= (b.Id - 3) 
       AND a.id < b.Id
       AND b.Id > 3 
     ) as Average
FROM 
    MyTable b;
Run Code Online (Sandbox Code Playgroud)