查询 - Amazon Kinesis Data Analytics
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

查询

语法

<query> :=     <select>   | <query> <set-operator> [ ALL ] <query>   | VALUES <row-constructor> { , <row-constructor> }...   | '(' <query> ')'  <set-operator> :=     EXCEPT   | INTERSECT   | UNION  <row-constructor> :=     [ ROW ] ( <expression> { , <expression> }... )

选择

上图中的选择框代表任何 SELECT 命令;该命令在其自己的页面上有详细描述。

集合运算符(除外、相交、联合)

集合运算符使用集合运算组合查询生成的行:

  • EXCEPT 返回第一个集合中但不在第二个集合中的所有行

  • INTERSECT 返回第一组和第二组中的所有行

  • UNION 返回任一集合中的所有行

在所有情况下,这两个集合的列数必须相同,并且列类型必须与赋值兼容。生成的关系的列名是第一个查询的列名。

使用 ALL 关键字后,运算符将使用数学上的多重集合的语义,这意味着不会消除重复的行。例如,如果特定行在第一个集合中出现 5 次,在第二个集合中出现 2 次,则 UNION ALL 将发出行 3 + 2 = 5 次。

EXCEPT 或 INTERSECT 目前不支持 ALL。

所有运算符都是左关联运算符,INTERSECT 的优先级高于优先级相同的 EXCEPT 或 UNION。要覆盖默认优先级,可以使用括号。例如:

SELECT * FROM a UNION SELECT * FROM b INTERSECT SELECT * FROM c EXCEPT SELECT * FROM d EXCEPT SELECT * FROM E

相当于:

( ( SELECT * FROM a    UNION    ( SELECT * FROM b      INTERSECT      SELECT * FROM c) )  EXCEPT  SELECT * FROM d ) EXCEPT SELECT * FROM e

该示例等效于命令

UNION ALL 是唯一可以应用于直播的集合运算符。运算符的两端都必须是流;如果一端是流而另一端是关系,则是错误的。

例如,以下查询会生成一系列通过电话或网络接到的订单:

SELECT STREAM *  FROM PhoneOrders UNION ALL SELECT STREAM *  FROM WebOrders

行效于命令。流式传输 UNION ALL 发出的行的行时间与输入行的时间戳相同。

行时间边界:行时间边界是关于流的未来内容的断言。它指出流中的下一行将具有不早于边界值的 ROWTIME。例如,如果行时间边界是 2018-12-0223:23:07,则这告诉系统下一行将不早于 2018-12-0223:23:07 到达。行时间边界可用于管理数据流中的间隙,例如证券交易所过夜的间隙。

Amazon Kinesis Data Analytics 通过根据时间戳合并传入的行来确保 ROWTIME 列升序。如果第一个集合的行带有时间戳为 10:00 和 10:30,而第二组仅达到 10:15,则 Kinesis Data Analytics 会暂停第一组并等待第二组达到 10:30。在这种情况下,如果第二个集合的生成者发送一个行时间边界,那将是有利的。

值运算符

VALUES 运算符在查询中表示常量关系。(另请参阅本指南 SELECT 主题中对值的讨论。)

VALUES 可以用作顶级查询,如下所示:

VALUES 1 + 2 > 3; EXPR$0 ====== FALSE VALUES    (42, 'Fred'),    (34, 'Wilma'); EXPR$0 EXPR$1 ====== ======    42 Fred    34 Wilma

请注意,系统已为匿名表达式生成了任意列名。您可以通过将 VALUES 放入子查询并使用 AS 子句来分配列名:

SELECT * FROM (    VALUES        (42, 'Fred'),        (34, 'Wilma')) AS t (age, name); AGE NAME === ===== 42 Fred 34 Wilma