SQL每X行执行一列的平均值
我有一个包含以下(相关)列的表:id\u mi、date和value。 我想用y轴“value”列中的值和x轴中的日期构建一个图表,但是因为它们很多,我希望图表上的点是x行的平均值 对于本例,假设X=10: 我要做的是获取表中的前10个值,计算平均值并将其存储在一行中,然后下一行将包含11到20的平均值,依此类推 基本上,我需要在一个具有“value”列平均值的行中“压缩”10行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 (
我正在使用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。我删除了范围
关键字。