2013-06-23 45 views
2

我願做這樣的事情:在Firebird中,如何聚合前N行?

CNT=2; 

//[edit] 
select avg(price) from (
    select first :CNT p.Price 
    from Price p 
    order by p.Date desc 
); 

這不起作用,火鳥不允許:cnt作爲參數傳遞給第一位。我需要平均第一個CNT最新價格。數字2發生變化,因此無法進行硬編碼。

這可以分解爲FOR SELECT循環並在達到計數時中斷。那是最好的方法嗎?這可以在單個SQL語句中完成嗎?

將SQL創建爲字符串並運行它也不是最合適的。數據庫編譯我的SQL語句很重要。

回答

3

您不必使用CTE,你可以直接做到這一點:

select avg(price) from (
    select first :cnt p.Price 
    from Price p 
    order by p.Date desc 
); 
+0

Firebird拒絕使用「令牌未知」並指向變量cnt之前的':'。換句話說,它不接受變量作爲「FIRST」的參數。 – jcalfee314

+0

你的例子更好,所以我已經更新了這個問題...... – jcalfee314

+0

':variable'顯然只能在PSQL中工作。否則你不能定義變量。或者,您也可以使用基於您的提供商的參數。即在.NET中,您可以編寫'select first @cnt ...'並在'FbCommand'中定義參數。 –

1

在計算平均值之前,可以使用CTE(公用表表達式)(請參見http://www.firebirdsql.org/refdocs/langrefupd21-select.html#langrefupd21-select-cte)選擇數據。 見下面的例子:

with query1 as (
    select first 2 p.Price 
    from Price p 
    order by p.Date desc 
) 

select avg(price) from query1 
+0

不錯的嘗試,真的,我真的很享受的熱膨脹係數太大。但是,你硬編碼的2雖然。我不知道2;它是一個變量。 – jcalfee314