我在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?但是,我如何处理日期,类别对是这里的主要问题。
答案 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