空白填充和插值 (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_VALUE 和 TS_LAST_VALUE)以及 SQL TIMESERIES 子句完成这些任务。
但首先,我们将从常数插值开始,介绍 Vertica 中构成空白填充和插值的组件。
以下主题中的图像使用如下图例:
-
x 轴表示时间戳 (
ts
) 列 -
y 轴表示出价列。
-
垂直的蓝线用来分隔时间片。
-
红点表示表中的输入记录 $10.0 和 $10.5。
-
蓝色星形表示输出值,包括内插值。