填补PostgreSQL时间序列中的空白

时间:2016-04-28 14:07:03

标签: postgresql common-table-expression window-functions

我的问题始于一组采用以下一般形式的表:

CREATE TABLE data_table (
  entity_fk     integer,
  timestamp     timestamptz,
  value         bigint
);

对于每个 entity_fk ,每隔30秒到2分钟插入一个数据点,因此插入之间的时间不是恒定的。

正常选择模式是获取特定日期的单个 entity_fk 的所有数据点。然后将该数据绘制成图形/可视化。

为了使可视化软件能够正确显示/注释数据中的间隙,我需要在时间序列中填充SELECT填充的NaN entity_fk

所以这就是我想要做的事情:

对于此数据,将24小时时段分解为4分钟窗口,然后仅填充那些不包含 任何 特定时间戳的4分钟窗口entity_fk具有均匀分布的30秒时间戳和NaN值。

到目前为止,我对此的概念方法是:

  1. 从CTE开始,将其分解为可管理的部分。
  2. 为从时间戳派生的特定DATE选择特定 entity_fk 的所有行。
  3. SELECT(使用generate_series)在整个24小时内间隔30秒间隔的一系列时间戳,包括所选的DATE,每个都具有的NaN和 entity_fk 和我们正在寻找的那个一样
  4. 使用窗口功能(n-tile?)将特定日期的整个24小时时段分成4分钟窗口。
  5. 对于没有实际数据的任何4分钟窗口,请替换生成的行。 确实的任何4分钟窗口都会保留原样的数据。
  6. 我可以单独执行步骤1-3,但不能在CTE环境中执行。关于如何执行步骤4-5,我完全失去了。

    这是我在选择entity_fk 7的所有可用时间戳时得到的一个例子(在很短的时间范围内):

     entity_fk |       timestamp        | value
    -----------+------------------------+-------
             7 | 2016-04-05 13:00:00+00 |     1
             7 | 2016-04-05 13:00:32+00 |     2
             7 | 2016-04-05 13:01:14+00 |     3
             7 | 2016-04-05 13:01:54+00 |     4
             7 | 2016-04-05 13:02:49+00 |     5
             7 | 2016-04-05 13:03:39+00 |     6
             7 | 2016-04-05 13:13:00+00 |     7
             7 | 2016-04-05 13:13:48+00 |     8
             7 | 2016-04-05 13:15:04+00 |     9
    

    这就是我想要的样子,填补了值6和7之间的差距:

     entity_fk |       timestamp        | value
    -----------+------------------------+-------
             7 | 2016-04-05 13:00:00+00 |     1
             7 | 2016-04-05 13:00:32+00 |     2
             7 | 2016-04-05 13:01:14+00 |     3
             7 | 2016-04-05 13:01:54+00 |     4
             7 | 2016-04-05 13:02:49+00 |     5
             7 | 2016-04-05 13:03:39+00 |     6
             7 | 2016-04-05 13:04:00+00 |   NaN
             7 | 2016-04-05 13:04:30+00 |   NaN
             7 | 2016-04-05 13:05:00+00 |   NaN
             7 | 2016-04-05 13:05:30+00 |   NaN
             7 | 2016-04-05 13:06:00+00 |   NaN
             7 | 2016-04-05 13:06:30+00 |   NaN
             7 | 2016-04-05 13:07:00+00 |   NaN
             7 | 2016-04-05 13:07:30+00 |   NaN
             7 | 2016-04-05 13:08:00+00 |   NaN
             7 | 2016-04-05 13:08:30+00 |   NaN
             7 | 2016-04-05 13:09:00+00 |   NaN
             7 | 2016-04-05 13:09:30+00 |   NaN
             7 | 2016-04-05 13:10:00+00 |   NaN
             7 | 2016-04-05 13:10:30+00 |   NaN
             7 | 2016-04-05 13:11:00+00 |   NaN
             7 | 2016-04-05 13:11:30+00 |   NaN
             7 | 2016-04-05 13:12:00+00 |   NaN
             7 | 2016-04-05 13:12:30+00 |   NaN
             7 | 2016-04-05 13:13:00+00 |     7
             7 | 2016-04-05 13:13:48+00 |     8
             7 | 2016-04-05 13:15:04+00 |     9
    

0 个答案:

没有答案