SQL每X行执行一列AVG

我有一个包含以下(相关)列的表:id_mi,date和value.

我想使用y轴“value”列中的值和x轴中的日期来构建图形,但由于它们很多,我希望图表上的点是X行的平均值.

假设这个例子X = 10:

我要做的是在我的表上获取前10个值,计算平均值并将其存储在一行中,而后续行将包含11到20之间的平均值,依此类推.

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

我正在使用Postgres 9.2

最佳答案 您可以使用窗口函数执行此操作:

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

如果你想确定从第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;

编辑:

您修改后的问题要容易得多:

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)来获取组号.

点赞