计算移动平均线和更新

时间:2016-06-02 13:28:32

标签: sql sql-server

我一直在努力为数据集添加移动平均线。这是我必须要做的事情:

ID, SamplerName,  CreatedOn,  Average, MovingAverage
1,    type A,    05/01/2016,     100,       null
2,    type B,    05/01/2016,     110,       null
3,    type A,    05/02/2016,     105,       null
4,    type B,    05/02/2016,     102,       null

这是我数据的一个非常简化的示例,实际上我有大约15个SamplerNames,并且将来可能会发生变化。

我尝试设置一个游标来遍历一个列表,该列表是通过在表中的sampler标签上执行select distinct而生成的,然后通过执行类似的操作来更新MovingAverage AVG([Average]) OVER (ORDER BY [CreatedOn] ROWS UNBOUNDED PRECEDING)但我遇到了错误

  

"窗口函数只能出现在select或order by order"。

我已尝试过其他一些解决方案,但我无法弄明白,我希望有人可以帮我一臂之力。

2 个答案:

答案 0 :(得分:0)

您可以使用可更新的CTE:

in controller: Object
in service: Object

答案 1 :(得分:0)

行/范围子句是在SQL Server 2008中引入的。如果您使用的是2008+,则会错过partition by SamplerName

avg(Average) over (partition by SamplerName order by CreatedOn rows unbounded preceding) 

示例:

declare @T table (ID int, SamplerName varchar(6), CreatedOn datetime, Average float)

insert into @T (ID, SamplerName, CreatedOn, Average)
select 1, 'type A', '2016-05-01', 100 union all
select 2, 'type B', '2016-05-01', 110 union all
select 3, 'type A', '2016-05-02', 105 union all
select 4, 'type B', '2016-05-02', 102


select *,
    avg(Average) over (partition by SamplerName order by CreatedOn rows unbounded preceding)
from @T