使用date_trunc进行滚动平均

时间:2017-04-10 23:42:04

标签: postgresql

我正在使用date_trunc在时间戳字段上进行汇总。我试图计算一个月内给定字段中唯一值的数量。如果我选择month作为我的决议:

SELECT date_trunc('month', timestamp), COUNT(DISTINCT(foo)) FROM ...

然后所有结果条目都在每个月的开头,因此“2017-01-01”将计算timestamp字段在1月份的任何位置的唯一条目。

有没有办法指定一个偏移量,以便我可能在2017-01-15有一个条目,包括截至2017-02-15的条目?

感谢。

2 个答案:

答案 0 :(得分:0)

SELECT 
    date_trunc('month', timestamp + interval '15 day'),
    COUNT(DISTINCT(foo)) 
FROM ...
group by 1

答案 1 :(得分:0)

这种查询从来都不是很有效。如果速度是一个问题,也许最好通过循环使用应用程序语言

在数据库之外执行此操作

在子查询中,对于每条记录,我们生成一系列日期,将其包含在聚合中,然后我们按生成的日期进行聚合。

SELECT
    mydate
  , COUNT(DISTINCT foo)
FROM (SELECT GENERATE_SERIES( DATE("timestamp") - INTERVAL '30 DAYS'
                            , DATE("timestamp"), '1 DAY') mydate
           , foo
      FROM mytable) expanded
GROUP BY 1

另外,请尽量不要使用timestamp作为列名作为postgresql数据类型。