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'