我可以在 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)
我有一个查询,从价格列计算 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)