我有一个包含以下(相关)列的表: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)来获取组号.