INTERPOLATE

使用某些有序属性将两个 事件序列联接在一起,通过联接事件序列,您可以直接比较两个序列的值,而不是将这些序列都标准化为相同的度量间隔。

语法

expression1 INTERPOLATE PREVIOUS VALUE expression2

参数

描述

  • 事件序列联接是常规外联接的扩展。事件序列联接不会在找不到匹配时用 NULL 值填充非保留侧,而是用表中的前一个值填充非保留侧。

  • 常规外联接与事件序列联接表达式的不同之处在于 ON 子句中使用的 INTERPOLATE 谓词。请参阅“注释和限制”下方的示例 部分。另请参阅 事件序列联接

  • 根据其他 ON 子句等同谓词将表中数据按照逻辑分区。

  • 插值来源于包含 null 值的表,而不是其他表。

  • Vertica 无法保证输出中不存在 null 值。如果不匹配行之前没有值,则用 null 填充该行。

  • 事件序列联接需要两个表的列均按照等同谓词以任何顺序进行排序,然后接 INTERPOLATED 列。如果数据已经按照这个顺序排序,则可以避免显式排序,从而提升查询性能。例如,给定下表:

    ask: exchange, stock, ts, pricebid: exchange,
    stock, ts, price
    

    在接下来的查询中

    • askexchange, stock 排序(或相反), ts

    • bidexchange, stock 排序(或相反), ts

    SELECT ask.price - bid.price, ask.ts, ask.stock, ask.exchange
    FROM ask FULL OUTER JOIN bid
       ON ask.stock = bid.stock AND ask.exchange =
       bid.exchange AND ask.ts INTERPOLATE PREVIOUS
       VALUE bid.ts;
    

限制

  • 每个联接仅可使用 INTERPOLATE 表达式一次。

  • INTERPOLATE 表达式仅使用 ANSI SQL-99 语法 (ON 子句),其支持全外联接。

  • INTERPOLATE 仅可使用等同谓词。

  • 支持 AND 运算符,但不支持 OR 和 NOT 运算符。

  • 不支持表达式以及隐式转换和显式转换,但可以使用子查询。

示例

接下来的示例中使用了此简单架构。

CREATE TABLE t(x TIME);
CREATE TABLE t1(y TIME);
INSERT INTO t VALUES('12:40:23');
INSERT INTO t VALUES('14:40:25');
INSERT INTO t VALUES('14:45:00');
INSERT INTO t VALUES('14:49:55');
INSERT INTO t1 VALUES('12:40:23');
INSERT INTO t1 VALUES('14:00:00');
COMMIT;

常规全外联接

=> SELECT * FROM t FULL OUTER JOIN t1 ON t.x = t1.y;

请注意来自非保留表的 null 行。

    x     |    y
----------+----------
 12:40:23 | 12:40:23
 14:40:25 |
 14:45:00 |
 14:49:55 |
          | 14:00:00
(5 rows)

带插值的全外联接

=> SELECT * FROM t FULL OUTER JOIN t1 ON t.x INTERPOLATE
PREVIOUS VALUE t1.y;

在本例中,没有入口点的行用前一行的值进行填充。

    x     |    y
----------+----------
 12:40:23 | 12:40:23
 12:40:23 | 14:00:00
 14:40:25 | 14:00:00
 14:45:00 | 14:00:00
 14:49:55 | 14:00:00
(5 rows)

常规左外联接

=> SELECT * FROM t LEFT OUTER JOIN t1 ON t.x = t1.y;

同样,非保留表中有 null

    x     |    y
----------+----------
 12:40:23 | 12:40:23
 14:40:25 |
 14:45:00 |
 14:49:55 |
(4 rows)

带插值的左外联接

=> SELECT * FROM t LEFT OUTER JOIN t1 ON t.x INTERPOLATE
   PREVIOUS VALUE t1.y;

用插值填充 null。

    x     |    y
----------+----------
 12:40:23 | 12:40:23
 14:40:25 | 14:00:00
 14:45:00 | 14:00:00
 14:49:55 | 14:00:00
(4 rows)

内联接

对于内联接,常规内联接与事件序列内联接没有差别。因为结果集中没有 null 值,所以无需插值操作。

常规内联接仅返回唯一匹配行 12:40:23:

=> SELECT * FROM t INNER JOIN t1 ON t.x = t1.y;
    x     |    y
----------+----------
 12:40:23 | 12:40:23
(1 row)

事件序列内联接也找到了相同的唯一匹配行 12:40:23:

=> SELECT * FROM t INNER JOIN t1 ON t.x INTERPOLATE
PREVIOUS VALUE t1.y;
    x     |    y
----------+----------
 12:40:23 | 12:40:23
(1 row)

语义

如果要编写事件序列联接以取代常规联连,则按下列方式来评估值(使用上述示例中的架构):

  • t 是外部保留表

  • t1 是内部非保留表

  • 对于外部表 t 中的每一行,针对内部表 t1 中每一行的每个组合来评估 ON 子句谓词。

  • 如果针对任意的行组合的 ON 子句谓词评估为真,则在输出中生成组合行。

  • 如果针对所有组合的 ON 子句为假,则生成一个单独的输出行,其中包含t 中行的值,以及 t1 中的列,其选自 t1 中具有最大 t1.y 值的行,以使得 t1.y < t.x;如果没有找到这样的行,则用 null 填充。

在全外联接的情况下,两个表中的所有值都被保留。

另请参阅