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

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

时间筛选条件

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

谓词 涵盖的关系

CONTAINS

OVERLAPS

EQUALS

先于

继任

立即先于

立即继任筛选条件

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

语法

时间谓词已集成到一个新的布尔值表达式中:

<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)