2016-10-28 34 views
2

我從一列價格像這樣計算出50日均線的查詢:我可以使用一個變量,而不是整數OVER子句

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

我不是答案,因爲我還沒有碰到某些這之前,但它似乎是這樣的[在SQL服務器中使用TOP的變量](http://stackoverflow.com/questions/1927450/use-variable-with-top-in-select-statement-in -SQL-服務器沒有制定-IT-dynami)。爲了做到這一點,你必須把這個變量放在禁忌之中。也許嘗試(@MA)之前和當前行之間的行,看看它是否讓人開心。 JNevill

+0

@JNevill好的想法,但我只是嘗試過'(50)和(@MA)',在這兩種情況下它肯定都不喜歡括號 – Rich

+0

Shucks。聽起來像你必須去動態SQL然後。這總是一個派對pooper :( – JNevill

回答

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) 
+0

動態作品!謝謝 – Rich

+0

@Rich樂於幫助。 –

1

遺憾的是沒有。如果您知道如何閱讀它們,那麼SQL文檔中包含的語法圖很全面。

當您仔細閱讀OVER之後,您終於會發現PRECEDING規範的變體是<unsigned_value_specification> PRECEDING

再低了下去:

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

所以,不幸的是,你在這個時候唯一的選擇是使用字面 - 不是一個變量,而不是一個表達式。當允許變體(變量與文字,比如說)時,語法圖確實傾向於使這些變體顯式可見。


可比語法TOP有:

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

這裏,你已經知道了,你可以在這裏使用任何表達。

+0

謝謝你的解釋 – Rich

相關問題