我有一个查询,从列价格计算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'
附近的语法不正确
答案 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)