✅ Azure 流分析 ✅ 构造事件流
LAST 分析运算符允许在定义的约束内查找事件流中的最新事件。 在计算最后一个已知良好值(例如不为 null)的方案中,它很有用,在事件匹配特定条件时查找最后一次等。
在流分析中,使用 LIMIT DURATION 子句将最后一个范围(即,历史记录中距离它需要查找的当前事件有多远)始终限制为有限的时间间隔。 LAST 可以选择性地限制为仅考虑使用 PARTITION BY 和 WHEN 子句与特定属性或条件上的当前事件匹配的事件。 LAST 不受 WHERE 子句中的谓词、JOIN 子句中的联接条件或当前查询的 GROUP BY 子句中的分组表达式的影响。
备注:LAST(<表达式,<默认值>)等效于 LAG(<表达式>>,0,<默认值>),即偏移值设置为“0”。 请注意,LAG(<表达式>,0, <默认值>)实际上不是一个有效的构造,因为 LAG 采用的偏移量大于或等于 1。 因此,必须使用 LAST 运算符,这是为了方便和提高可读性而引入的。
语法
LAST(<scalar_expression >, [<default>])
OVER ( [PARTITION BY <partition key>] LIMIT DURATION(<unit>, <length>) [WHEN boolean_expression])
论据
scalar_expression
要返回的值。 它是返回单个(标量)值或通配符表达式“*”的任何类型的表达式。 对于“*”,将返回整个事件,并将包含在结果事件(嵌套记录) 中。 scalar_expression不能包含其他分析函数或外部函数。
默认
没有事件匹配条件时要返回的值。 如果未指定默认值,则返回 NULL。 如果limit_duration_clause中指定的时间间隔内没有以前的事件或事件存在,但与when_clause中指定的条件不匹配,则“无事件”可能是这种情况。 如果该事件存在并且scalar_expression的值为 NULL,则返回 NULL。 default 可以是列、子查询或其他表达式,但它不能包含其他分析函数或外部函数。 default 的类型必须与scalar_expression完全相同。
OVER ([ partition_by_clause ] limit_duration_clause [when_clause])
partition_by_clause PARTITION BY <分区键> 子句仅请求其值为的事件
<分区键与当前事件的分区键> 相同。
limit_duration_clause DURATION(<单位>、 <长度>):
指定必须考虑当前事件中的历史记录量。 有关支持的单位及其缩写的详细说明,请参阅 DATEDIFF。 如果在 DURATION 间隔内找不到足够的匹配事件,则 <返回默认值> 。
when_clause 指定在 LAST 计算中要考虑的事件的布尔条件。 如果在 DURATION 间隔内未找到匹配事件,则 <返回默认值> 。 when_clause是可选的。
返回类型
指定scalar_expression的数据类型。 如果scalar_expression,则返回 NULL
一般备注
LAST 是不确定的。 事件按时态顺序进行处理。 如果有多个事件具有相同时间戳事件,则按到达顺序进行处理。
对 开窗函数 的结果集应用 LAST 可能会产生意外的结果。 窗口化函数会更改事件的时间戳,因为每个窗口作都会在窗口末尾输出事件。 在窗口作后,可以使用 system.timestamp()访问事件的当前时间戳,它与原始事件时间属性不同。 如果无法在窗口作之前移动 LAST,请考虑使用 CollectTop,按原始事件时间排序。
例子
查找最新的非 null 传感器读数:
SELECT
sensorId,
LAST(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading IS NOT NULL)
FROM input
查找上次阅读时间大于 50:
SELECT
sensorId,
LAST(System.Timestamp()) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading > 50 )
FROM input