在postgreSQL中移动窗口平均值

时间:2016-02-15 16:27:26

标签: postgresql date aggregate-functions window-functions

我在csv文件中有一个包含日期,类别和值的数据集。 但是,日期可能会有差距。 E.g。

Date       |  Category   | Value
2016-01-01   Category A      6
2016-01-02   Category A      7
2016-01-03   Category A      4
2016-01-01   Category B      4
2016-01-01   Category C      16
2016-01-02   Category C      8
2016-01-02   Category D      5

我在PostgreSQL中的表中导入了数据。

我需要为每个类别计算过去7天的滚动平均值(对于此示例,我们将其简化为过去3天)。但是,我需要将每个类别的缺失日期填写为0.我最初尝试的是:

在计算平均值

之前,添加0的空白字段
Select Seven_day.date,
        coalesce(data.value,Seven_day.blank_count),
        category, 
    from ( select distinct GENERATE_SERIES(t.date-'6 day'::interval,t.date,'1 day'::interval)::date as date,
            0 as blank_count 
        from data t) as Seven_day
    left outer join data on data.date=Seven_day.date

但是,这不会生成正确的空白字段。此外,由于我的数据集非常大,因此非常慢。

有没有更好的方法来解决这个问题?是否可以在创建表本身时处理此问题?例如自动生成日期为系列,默认值为0?但是,我如何处理日期,类别对是这里的主要问题。

2 个答案:

答案 0 :(得分:4)

3天的平均值可扩展到任意天数:SQL Fiddle

~/shared

答案 1 :(得分:0)

我找到了一个迷你解决方案:

Select Seven_day.date,
Seven_day.category as cat,
    coalesce(test.value,Seven_day.blank_count)
from ( select distinct GENERATE_SERIES(t.date-'6 day'::interval,t.date,'1 day'::interval)::date as date, t.category,
        0 as blank_count 
    from test t
     order by t.category,date) as Seven_day
left outer join test on test.date=Seven_day.date and test.category=Seven_day.category
order by cat,date