2017-10-05 274 views
1
ID Date Value Average 
1 10/5/2017 15 15 
2 10/6/2017 25 20 
3 10/7/2017 35 25 
4 10/8/2017 45 35 
5 10/9/2017 55 45 
6 10/10/2017 65 55 
7 10/11/2017 75 65 

如果这是我的表,我希望平均值是一个计算列,它的公式一般是前3行的值列的平均值。SQL Server 2012计算列

(Ex. for 2nd row it is (25+15)/2) 

我如何在计算列中做这样的事情?有没有更好的方法来实现这一点。

在此先感谢。

+0

当你说帧条款最后三个,这意味着一个订单,这需要一个查询n按条款排序。计算列不意味着以这种方式工作,它们基于单行。我同意TheGameisway,你应该使用一个视图。 Lead和Lag功能可能有用。 –

+0

谢谢。你能帮我一个例子吗?我从来没有使用过铅和滞后函数 – Madhukar

+0

看起来你有一个答案,应该使用平均窗口函数。 –

回答

2

我会去的视图,并通过avg窗口功能

select 
    id, 
    date, 
    value, 
    avg(value) over (order by id) 
    from table 

更新答案:,你可以使用如下

Working Demo

;with cte(id,date,val) 
as 
(

select 1 ,'10/5/2017' , 15 UNION ALL 
select 2 ,'10/6/2017' , 25 UNION ALL 
select 3 ,'10/7/2017' , 35 UNION ALL 
select 4 ,'10/8/2017' , 45 UNION ALL 
select 5 ,'10/9/2017' , 55 UNION ALL 
select 6 ,'10/10/2017', 65 UNION ALL 
select 7 ,'10/11/2017', 75 
) 
SELECT *,avg(VAL) OVER (ORDER BY id rows between 2 PRECEDING and current row) FROM CTE 
+0

对于每一行,该值应该是3个先前行值的平均值。我无法使用您的解决方案。 – Madhukar

+0

如果第二行的例子中有前3行,那么它的平均值为3行,否则在前2行或前1行中不会说'(25 + 15)/ 2' – TheGameiswar

+0

。在我的问题中,我包括目前的行和前面的2行 – Madhukar