我可以在OVER子句中使用变量而不是整数

时间:2016-10-28 13:41:10

标签: sql sql-server window-functions

我有一个查询,从列价格计算50天移动平均值:

select Date,  
       price, 
       avg(price) over( order by Date, Date rows between 50 preceding and current row) as moving_avg 
from t1

现在我想用整数变量替换整数50来做一个测试不同移动平均长度的循环。

当我尝试时,我得到:

  

' @ MA'

附近的语法不正确

2 个答案:

答案 0 :(得分:1)

不幸的是没有。如果您知道如何阅读它们,那么SQL文档中包含的语法图就非常全面。

当您仔细阅读OVER的内容时,您最终会发现PRECEDING规范的变体为<unsigned_value_specification> PRECEDING

然后降下来:

<unsigned value specification> ::=   
{  <unsigned integer literal> } 

所以,不幸的是,您目前唯一的选择是使用文字 - 而不是变量,而不是表达式。当允许变体(变量与文字,比如说)时,语法图确实倾向于使这些变体明确可见。

TOP的可比语法有:

[   
    TOP (expression) [PERCENT]  
    [ WITH TIES ]  
]  

如您所知,您可以在此处使用任何表达式。

答案 1 :(得分:1)

我希望(选择@MA)可行,但唉没有运气

也许你可以动态

Declare @MA int = 50

Declare @SQL varchar(max) ='Select Date, price, avg(price) over( order by Date, Date rows between '+cast(@MA as varchar(25))+' preceding and current row) as moving_avg from t1 '
Exec(@SQL)