ISFIRST(Azure 流分析)

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

语法

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

参数

timeunit

是持续时间的时间单位。 下表列出了所有有效时间单位值---两个已满
可以在查询中使用名称和缩写。

时间单位 缩写形式
day dd、d
hour hh
minute mi、n
第 2 个 ss、s
毫秒 ms
微秒 mcs

duration

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

[ 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 (“1”或“0”,分别表示“true”或“false”)

一般备注

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 的第一个事件
per 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'

另请参阅

延隔时间(Azure 流分析)
上一 (Azure 流分析)