我有一个包含以下(相关)列的表:id_mi,日期和值。 我想使用y轴中的“值”列中的值和x轴中的日期来构建图表,但由于它们很多,我希望图表上的点是X行的平均值。SQL每隔X行执行一列AVG
假设X = 10这个例子:
我试图做的是拿到第10个值在我的表,计算平均值并将其存储在一排,比下面一行将包含从11到20的值的平均值等等。
基本上我需要“压缩”10行中的一个具有“值”列的平均值的行。
我使用的是Postgres 9.2
我有一个包含以下(相关)列的表:id_mi,日期和值。 我想使用y轴中的“值”列中的值和x轴中的日期来构建图表,但由于它们很多,我希望图表上的点是X行的平均值。SQL每隔X行执行一列AVG
假设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;
,你可以这样做:
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)
得到组号码。
重点是做你所说的一个一个的窗口,所以我第一次有一个窗口是1-10,第二次是2-11,3-13等等。我想要的是一个10乘10的窗口,所以第一次平均在1-10行之间,第二次11-20,21-30等等。 第二段代码,如果我是正确的开始执行平均计算从第10行开始 – MastErAldo
顺便说一句,我认为“范围”关键字必须删除,因为postgres文档说,选择范围和行: http: //www.postgresql.org/docs/9.1/static/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS – MastErAldo
@MastErAldo。 。 。我删除了'range'关键字。 –
会MS SQL解决方案的帮助? – DhruvJoshi
如果ms sql解决方案在某种程度上由postgres 9.2语法支持,那么是因为我需要使用postgres – MastErAldo
您是否有自动递增键? – Mihai