【问题标题】:SQL perform AVG of a column every X rowsSQL 每 X 行执行一列的 AVG
【发布时间】:2014-01-29 11:23:53
【问题描述】:

我有一个包含以下(相关)列的表:id_mi、日期和值。 我想使用 y 轴上的“值”列中的值和 x 轴上的日期来构建一个图表,但由于它们很多,我希望我的图表上的点是 X 行的平均值。

在这个例子中假设 X = 10:

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

基本上,我需要将 10 行“压缩”到一个具有“值”列的平均值的行中。

我正在使用 Postgres 9.2

【问题讨论】:

  • ms sql 解决方案有帮助吗?
  • 如果 ms sql 解决方案在某种程度上受到 postgres 9.2 语法的支持而不是 :) 因为我需要使用 postgres
  • 你有自动增量键吗?
  • 是的,我们有自动递增的表(id_mi)的主键
  • 大概是date 列定义了应该考虑行的顺序,以便定义“第一个”、“下一个”等。

标签: sql postgresql average


【解决方案1】:

您可以使用窗口函数来做到这一点:

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

【讨论】:

  • 重点是按你说的做窗口一个接一个地移动,所以第一次我的窗口是1-10,第二次是2-11、3-13等等.我想要的是一个移动 10 乘 10 的窗口,所以第一次平均是在 1-10 行之间,第二次是 11-20、21-30 等等。如果我是正确的,第二段代码开始执行从第 10 行开始的平均计算
  • 顺便说一句,我认为必须删除“范围”关键字,因为 postgres 文档说要在范围和行之间进行选择:postgresql.org/docs/9.1/static/…
  • @MastErAldo 。 . .我删除了range 关键字。
猜你喜欢
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
相关资源
最近更新 更多