SQL每X行执行一列的AVG

Mas*_*ldo 5 sql postgresql average

我有一个包含以下(相关)列的表:id_mi,日期和值。我想使用y轴的“值”列中的值和x轴中的日期来构建图形,但是由于它们很多,我希望图形上的点是X行的平均值。

假设本例中X = 10:

我想做的是获取表中的前10个值,计算平均值并将其存储在一行中,然后下一行将包含11到20的平均值,依此类推。

基本上,我需要在具有“值”列平均值的单个行中“压缩” 10行。

我正在使用Postgres 9.2

Gor*_*off 3

您可以使用窗口函数来做到这一点:

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

如果您想确保从第 10 行开始,您可以执行以下操作:

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;
Run Code Online (Sandbox Code Playgroud)

编辑:

您修改后的问题更容易:

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;
Run Code Online (Sandbox Code Playgroud)

Postgres 进行整数除法,但如果你想明确一点,你可以这样做: trunc((seqnum - 1) / 10)获取组号。