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

Can I use a variable instead of the integer in OVER clause

我有一个查询,从价格列计算 50 天移动平均线,如下所示:

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

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

当我尝试时,我得到:

Incorrect syntax near '@MA'

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

当您细读 OVER 的规范时,您最终会发现 PRECEDING 规范的变体是 <unsigned_value_specification> PRECEDING.

然后降低:

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

所以,不幸的是,此时您唯一的选择是使用文字——不是变量,不是表达式。当允许变体(例如变量与文字)时,语法图确实倾向于使此类变体明确可见。


TOP 的可比较语法有:

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

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

我希望 (Select @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)