空白填充和插值 (GFI)

此主题中用于解释概念的示例和图形,均使用以下简单的架构:

CREATE TABLE TickStore (ts TIMESTAMP, symbol VARCHAR(8), bid FLOAT);
INSERT INTO TickStore VALUES ('2009-01-01 03:00:00', 'XYZ', 10.0);
INSERT INTO TickStore VALUES ('2009-01-01 03:00:05', 'XYZ', 10.5);
COMMIT;

在 Vertica 中,时序数据以一系列符合特定表架构的行表示,其中一列用于存储时间信息。

时序中的时间和数据状态都是连续性的。因此,随时间的推移对 SQL 查询进行评估具有挑战性,因为输入记录的间隔通常不均匀,而且会包含空白。

例如,下表中包含的两个输入行相隔五秒钟:3:00:00 和 3:00:05。

=> SELECT * FROM TickStore;
         ts          | symbol | bid
---------------------+--------+------
 2009-01-01 03:00:00 | XYZ    |   10
 2009-01-01 03:00:05 | XYZ    | 10.5
(2 rows)

根据这两个输入,如何确定时间位于这两个时间点之间的出价,例如 3:00:03 PM? TIME_SLICE 函数会将时间戳标准化为对应的时间片;但是,TIME_SLICE 并没有解决数据中缺少输入(时间片)这一问题。不过,Vertica 提供了空白填充和插值 (GFI) 功能,可以填充缺少的数据点并将已知数据点范围内的新(缺少的)数据点添加到输出中。它通过时序聚合函数(TS_FIRST_VALUETS_LAST_VALUE)以及 SQL TIMESERIES 子句完成这些任务。 但首先,我们将从常数插值开始,介绍 Vertica 中构成空白填充和插值的组件。 以下主题中的图像使用如下图例:

  • x 轴表示时间戳 (ts) 列

  • y 轴表示出价列。

  • 垂直的蓝线用来分隔时间片。

  • 红点表示表中的输入记录 $10.0 和 $10.5。

  • 蓝色星形表示输出值,包括内插值。