View a markdown version of this page

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

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

时间谓词

下表以图形方式显示了标准 SQL 支持的时间谓词以及对 Amazon Kinesis Data Analytics 支持的 SQL 标准的扩展。它显示了每个谓词所涵盖的关系。每个关系均表示为时间间隔上限和下限,并具有组合意义 upperInterval predicate lowerInterval evaluates to TRUE。前 7 个谓词是标准 SQL。最后 10 个谓词(以粗体显示)是 Amazon Kinesis Data Analytics 对 SQL 标准的扩展。

谓词 涵盖的关系

CONTAINS

蓝色矩形形状水平排列,类似于简化的布局或结构。

OVERLAPS

蓝色矩形框成行排列,代表结构化布局或图表。

EQUALS

两个带有橙色边框的水平蓝色矩形,垂直堆叠。

PRECEDES

四个蓝色的矩形按钮或容器以错开的布局排列。

SUCCEEDS

四个蓝色矩形水平排列,它们之间有间隙。

IMMEDIATELY PRECEDES

两个水平进度条,蓝色填充和橙色边框处于不同的阶段。

IMMEDIATELY SUCCEEDS

白色背景下有两个水平的蓝色矩形形状。

LEADS

四个带有橙色轮廓的蓝色矩形按钮,水平排列。

LAGS

四个水平进度条或不同长度的加载指示器。

STRICTLY CONTAINS

两个带有橙色边框的蓝色矩形纽扣,一个比另一个大。

STRICTLY OVERLAPS

两个蓝色矩形按钮或不同大小的用户界面元素。

STRICTLY PRECEDES

两个蓝色的水平条,代表用户界面中的占位符元素。

STRICTLY SUCCEEDS

代表用户界面元素或按钮的两个蓝色矩形形状。

STRICTLY LEADS

两个带有橙色边框的蓝色矩形按钮,一个在上面小,一个在下方大。

STRICTLY LAGS

两个水平的蓝色矩形形状,一个在另一个上方,背景为白色。

IMMEDIATELY LEADS

两个带有橙色边框的蓝色矩形按钮,一个在上面大,一个在下方小。

IMMEDIATELY LAGS

两个带有橙色边框的蓝色矩形纽扣,一个比另一个大。

为了实现简洁的表达式,Amazon Kinesis Data Analytics 还支持以下扩展:

  • 可选 PERIOD 关键字 – 可忽略 PERIOD 关键字。

  • 紧凑链接 – 如果这些谓词中有两个背靠背出现并由 AND 分隔,则可以忽略 AND,前提是第一个谓词的右间隔与第二个谓词的左间隔相同。

  • TSDIFF – 此函数将选取两个 TIMESTAMP 参数并返回两者之差(以毫秒为单位)。

例如,您可以编写以下表达式:

 PERIOD (s1,e1) PRECEDES PERIOD(s2,e2)  AND PERIOD(s2, e2) PRECEDES PERIOD(s3,e3)

更简洁的版本如下所示:

(s1,e1) PRECEDES (s2,e2) PRECEDES PERIOD(s3,e3)

以下简洁的表达方式:

TSDIFF(s,e)

即以下表达式:

CAST((e - s) SECOND(10, 3) * 1000 AS BIGINT)

最后,标准 SQL 允许 CONTAINS 谓词将单个 TIMESTAMP 作为其右侧参数。例如,以下表达式:

PERIOD(s, e) CONTAINS t

等效于以下表达式:

s <= t AND t < e

语法

时间谓词被集成到一个值为 BOOLEAN 的新表达式中:

<period-expression> :=  <left-period> <half-period-predicate> <right-period> <half-period-predicate> :=  <period-predicate> [ <left-period> <half-period-predicate> ] <period-predicate> :=   EQUALS | [ STRICTLY ] CONTAINS | [ STRICTLY ] OVERLAPS | [ STRICTLY | IMMEDIATELY ] PRECEDES | [ STRICTLY | IMMEDIATELY ] SUCCEEDS | [ STRICTLY | IMMEDIATELY ] LEADS | [ STRICTLY | IMMEDIATELY ] LAGS <left-period> := <bounded-period> <right-period> := <bounded-period> | <timestamp-expression> <bounded-period> := [ PERIOD ] ( <start-time>, <end-time> ) <start-time> := <timestamp-expression> <end-time> := <timestamp-expression> <timestamp-expression> :=  an expression which evaluates to a TIMESTAMP value where <right-period> may evaluate to a <timestamp-expression> only if the immediately preceding <period-predicate> is [ STRICTLY ] CONTAINS

以下内置函数支持此布尔表达式:

BIGINT tsdiff( startTime TIMESTAMP, endTime TIMESTAMP )

以毫秒为单位返回 (endTime - startTime) 的值。

示例

以下示例代码会记录因窗户在空调开启时处于打开状态而发出的警报:

create or replace pump alarmPump stopped as  insert into alarmStream( houseID, roomID, alarmTime, alarmMessage ) select stream w.houseID, w.roomID, current_timestamp,                   'Window open while air conditioner is on.' from    windowIsOpenEvents over (range interval '1' minute preceding) w join    acIsOnEvents over (range interval '1' minute preceding) h on w.houseID = h.houseID where (h.startTime, h.endTime) overlaps (w.startTime, w.endTime);

示例使用案例

当两个人尝试在两个不同的地点同时使用同一张信用卡时,以下查询将使用时间谓词发出欺诈警报:

create pump creditCardFraudPump stopped as insert into alarmStream  select stream    current_timestamp, creditCardNumber, registerID1, registerID2  from transactionsPerCreditCard  where registerID1 <> registerID2  and (startTime1, endTime1) overlaps (startTime2, endTime2) ;

前面的代码示例使用具有以下数据集的输入流:

(current_timestamp TIMESTAMP, creditCardNumber VARCHAR(16), registerID1 VARCHAR(16), registerID2 VARCHAR(16), startTime1 TIMESTAMP, endTime1 TIMESTAMP, startTime2 TIMESTAMP, endTime2 TIMESTAMP)