ISFIRST

✅ Azure 流分析 ✅ 构造事件流

如果事件是给定固定间隔内的第一个事件,则返回 1;否则返回 0。 间隔与翻转窗口的对齐方式相同(请参阅 翻转窗口)。 ISFIRST 不受 WHERE 子句中的谓词、JOIN 子句中的联接条件或当前查询的 GROUP BY 子句中的分组表达式的影响。 ).

语法

ISFIRST ( timeunit  , duration )   
    [ OVER ( [PARTITION BY partition_by_expression] [WHEN when_expression]) ]  
  

论据

timeunit

持续时间的时间单位。 下表列出了所有有效的时间单位值,---两者都已满
名称和缩写可用于查询。

Timeunit 缩写形式
dd、d
小时 hh
分钟 mi、 n
ss、s
毫秒 女士
微秒 mcs

期间

一个大整数,指定间隔中的时间单位数。 例如,
ISFIRST(分钟,15 分钟)将查看 15 分钟的间隔。 间隔的开始时间为
与翻转窗口一样对齐(请参阅 翻转窗口)。

[ OVER (partition_by_clause [when_clause]) ]

OVER 子句指定此事件在其中排名的事件的子集:

PARTITION BY partition_by_expression 子句将 FROM 生成的结果集除以
子句应用于函数的分区。 换句话说,比较每个事件
仅共享其 partition_by_expression值的此类其他事件。 如果未指定,则每个
事件根据时间间隔内所有其他事件进行排名。

WHEN when_expression 子句指定要考虑的事件的布尔条件。
换句话说,每个事件仅与满足的其他事件进行比较
when_expression。 如果事件本身不满足 when_expression,则函数返回 0。
WHEN 子句是可选的。

返回类型

bigint(分别表示“true”或“false”的“1”或“0”)

一般备注

ISFIRST 是不确定的。 事件按时态顺序进行处理。 如果有多个事件具有相同时间戳事件,则按到达顺序进行处理。

开窗函数 的结果集应用 ISFIRST 可能会产生意外的结果。 窗口化函数会更改事件的时间戳,因为每个窗口作都会在窗口末尾输出事件。 在窗口作后,可以使用 system.timestamp()访问事件的当前时间戳,它与原始事件时间属性不同。 如果在窗口作之前无法移动 ISFIRST,请考虑使用 CollectTop,按原始事件时间排序。

例子

指示传感器读取事件是否为 10 分钟内的第一个翻转间隔:

SELECT  
       reading,  
       ISFIRST(mi, 10) as first  
FROM Input  

指示事件是否是每个 deviceid 的 10 分钟内第一个翻转间隔:

SELECT  
       deviceid,  
       reading,  
       ISFIRST(mi, 10) OVER (PARTITION BY deviceid) as first  
FROM Input  

指示事件是否是第一个值在 10 分钟翻转间隔内大于 50 的事件
每个 deviceid:

SELECT
       deviceid,
       reading,
       ISFIRST(mi, 10) OVER (PARTITION BY deviceid WHEN reading > 50 AND devicetype = 'thermostat') as firstAbove,
       ISFIRST(mi, 10) OVER (PARTITION BY deviceid WHEN reading < 50 AND devicetype = 'thermostat') as firstUnder
FROM Input
WHERE
       devicetype = 'thermostat'

另请参阅

滞后
上次