2014-01-29 73 views
3

我有一個包含以下(相關)列的表:id_mi,日期和值。 我想使用y軸中的「值」列中的值和x軸中的日期來構建圖表,但由於它們很多,我希望圖表上的點是X行的平均值。SQL每隔X行執行一列AVG

假設X = 10這個例子:

我試圖做的是拿到第10個值在我的表,計算平均值並將其存儲在一排,比下面一行將包含從11到20的值的平均值等等。

基本上我需要「壓縮」10行中的一個具有「值」列的平均值的行。

我使用的是Postgres 9.2

+0

會MS SQL解決方案的幫助? – DhruvJoshi

+0

如果ms sql解決方案在某種程度上由postgres 9.2語法支持,那麼是因爲我需要使用postgres – MastErAldo

+0

您是否有自動遞增鍵? – Mihai

回答

2

爲此,您可以使用窗口功能:如果你想確保你的第十個行

select avg(value) over (order by date 
         rows between 9 preceding and current row) as MovingAvg10 
from t; 

,你可以這樣做:

select (case when row_number() over (order by date) >= 10 
      then avg(value) over (order by date 
            rows between 9 preceding and current row 
           ) 
     end) as MovingAvg10 
from t; 

編輯:

修改後的問題要容易得多:

select ((seqnum - 1)/10) as whichgroup, avg(value) 
from (select row_number() over (order by date) as seqnum, t.* 
     from table t 
    ) t 
group by ((seqnum - 1)/10) 
order by 1; 

Postgres做整數除法,但如果你想明確,你可以這樣做:trunc((seqnum - 1)/10)得到組號碼。

+0

重點是做你所說的一個一個的窗口,所以我第一次有一個窗口是1-10,第二次是2-11,3-13等等。我想要的是一個10乘10的窗口,所以第一次平均在1-10行之間,第二次11-20,21-30等等。 第二段代碼,如果我是正確的開始執行平均計算從第10行開始 – MastErAldo

+0

順便說一句,我認爲「範圍」關鍵字必須刪除,因爲postgres文檔說,選擇範圍和行: http: //www.postgresql.org/docs/9.1/static/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS – MastErAldo

+0

@MastErAldo。 。 。我刪除了'range'關鍵字。 –