SQL每X行执行一列的平均值

SQL每X行执行一列的平均值,sql,postgresql,average,Sql,Postgresql,Average,我有一个包含以下(相关)列的表:id\u mi、date和value。 我想用y轴“value”列中的值和x轴中的日期构建一个图表,但是因为它们很多,我希望图表上的点是x行的平均值 对于本例,假设X=10: 我要做的是获取表中的前10个值,计算平均值并将其存储在一行中,然后下一行将包含11到20的平均值,依此类推 基本上,我需要在一个具有“value”列平均值的行中“压缩”10行 我正在使用Postgres 9.2您可以使用窗口功能来完成此操作: select avg(value) over (

我有一个包含以下(相关)列的表:id\u mi、date和value。 我想用y轴“value”列中的值和x轴中的日期构建一个图表,但是因为它们很多,我希望图表上的点是x行的平均值

对于本例,假设X=10:

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

基本上,我需要在一个具有“value”列平均值的行中“压缩”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)
来获取组号。

ms sql解决方案会有帮助吗?如果ms sql解决方案在某种程度上受Postgres 9.2语法支持,而不是“是:”),因为我需要使用Postgres。您有自动递增键吗?是的,我们有一个表的主键(id_mi),它会自动递增。这里,大概是
date
列定义了行的考虑顺序,以便定义“first”、“next”等。关键是,按你说的做,窗口会一个接一个地移动,所以我第一次有一个1-10的窗口,第二次是2-11,3-13等等。我想要的是一个10乘10的窗口,所以第一次平均值在第1-10行之间,第二次是11-20,21-30,依此类推。如果我是正确的,第二段代码将从第10行开始执行平均计算。顺便说一句,我认为必须删除“range”关键字,因为postgres文档说要在range和rows之间进行选择:@MastErAldo。我删除了
范围
关键字。