2014-01-29 45 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'关键字。 –