【问题标题】:Multiple averages over evenly spaced intervals均匀间隔的多个平均值
【发布时间】:2014-08-22 05:04:20
【问题描述】:

我正在努力学习 SQL,所以请耐心等待。我正在使用 PostgreSQL 9.3

我想根据日期窗口对列进行平均。我已经能够编写使用一组interval 来完成此操作的窗口函数,但我希望能够通过不断增长的interval 来完成此操作。我的意思是:

average values from date_0 to date_1
average values from date_0 to date_2
average values from date_0 to date_3
..... so date date_0 stays the same and date_x grows and creates a larger sample

我假设有比对我想要平均的每个范围运行查询更好的方法。任何建议表示赞赏。谢谢。

编辑

我正在尝试创建间隔均匀的 bin,用于汇总表的值。
我通过:

(MAX(date) - MIN(date)) / bins

date 是表的列
bins 是我想将表格分成的箱数。

date_0 = MIN(日期)
date_n = MIN(日期) + (间隔 * n)

【问题讨论】:

  • date_1 .. date_n 来自哪里?定期间隔?还是另一张桌子?
  • Erwin 我编辑了这个问题,试图回答你的区间问题。

标签: sql postgresql aggregate-functions average window-functions


【解决方案1】:

我建议使用方便的函数width_bucket()

获取每个时间段的平均值(“bin”):

SELECT width_bucket(extract(epoch FROM t.the_date)
                  , x.min_epoch, x.max_epoch, x.bins) AS bin
     , avg(value) AS bin_avg
FROM   tbl t
    , (SELECT extract(epoch FROM min(the_date)) AS min_epoch
            , extract(epoch FROM max(the_date)) AS max_epoch
            , 10 AS bins
       FROM   tbl t
      ) x
GROUP  BY 1;

要获得(逐步)增长时间间隔内的“运行平均值”:

SELECT bin, round(sum(bin_sum) OVER w /sum(bin_ct) OVER w, 2) AS running_avg
FROM  (
   SELECT width_bucket(extract(epoch FROM t.the_date)
                     , x.min_epoch, x.max_epoch, x.bins) AS bin
        , sum(value) AS bin_sum
        , count(*)   AS bin_ct
   FROM   tbl t
       , (SELECT extract(epoch FROM min(the_date)) AS min_epoch
               , extract(epoch FROM max(the_date)) AS max_epoch
               , 10 AS bins
          FROM   tbl t
         ) x
   GROUP  BY 1
   ) sub
WINDOW w AS (ORDER BY bin)
ORDER  BY 1;

使用the_date 而不是date 作为列名,避免使用reserved words 作为标识符。
由于width_bucket() 目前仅针对double precisionnumeric 实现,我从the_date 中提取纪元值。详情看这里:
Aggregating (x,y) coordinate point clouds in PostgreSQL

【讨论】:

  • 我不断收到“错误:函数 width_bucket(date, date, date, integer) 不存在。提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 "
  • @user3204587:我的疏忽。 width_bucket() 仅适用于 dpnumeric。我相应地更新了我的答案。
  • 我投了赞成票,不管你给了我多大的帮助,也因为你把我介绍给width_bucket(),但这会返回一个桶的恒定间隔内的平均值,对吗?不是从 date_0 到 date_n 的增长区间,其中 date_n = MIN(the_date) + (interval * n)?
  • @user3204587:这将返回涵盖表中完整时间范围的十个等长时间间隔中的每一个的平均值。应该是Q要求的。啊! ..现在我明白了,你的间隔都从date_0开始...
  • @user3204587:添加了计算“增长间隔”平均值的解决方案。
【解决方案2】:

如果你有一组数据,你可以很容易地在不同的列中得到你想要的:

select avg(case when date between date_0 and date_1 then value end) as avg1,
       avg(case when date between date_0 and date_2 then value end) as avg2,
       . . .
       avg(case when date between date_0 and date_n then value end) as avgn            
from table t
where date >= date_0;

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多