我在使用流分析窗口时遇到了一些问题。我的流分析作业的输入是一个事件流,其中包含来自属于信号的传感器/实体的温度读数。每个信号有大约 600 个实体。示例事件如下所示。
{
"SignalId": "1",
"EntityId": "1",
"Temperature": 78
}
流分析正在从看起来像这样的参考数据 blob 中读取每个实体的阈值。
[{
"SignalId": "1",
"Entities": [{
"Id": 1,
"Threshold": 60
}, {
"Id": 2,
"Threshold": 108
}, {
"Id": 3,
"Threshold": 106
}]
}, {
"SignalId": "2",
"Entities": [{
"Id": 1,
"Threshold": 65
}, {
"Id": 2,
"Threshold": 120
}, {
"Id": 3,
"Threshold": 107
}]
}]
如果温度值大于它们各自的阈值,我编写了一个流分析查询来过滤事件并在 Azure SQL 数据库中插入一个“警报”。
SELECT
e.SignalId AS SignalId,
e.EntityId AS EntityId,
e.Temperature AS AttrValue,
entities.ArrayValue.Threshold AS Threshold,
SYSTEM.TIMESTAMP AS EventTimestamp
INTO
output
FROM
eventhub e
JOIN
referenceblob b
ON
e.SignalId = b.SignalId
CROSS APPLY
GetElements(b.Entities) entities
WHERE
e.EntityId = entities.ArrayValue.Id
AND
e.Temperature > entities.ArrayValue.Threshold
我现在需要的是在上面放一个滑动窗口(我假设)。如果实体的温度值连续超过其各自的阈值 1 小时,我只想创建一个“警报”。插入的行应该包含与窗口中最后一个事件相关的数据。
我是流分析和 T-SQL 的新手,老实说,我并不完全了解窗口函数的工作原理。这是我的问题...
如果我连续 30 分钟收到不良事件(温度大于阈值),然后收到一个好事件,是否可以编写一个查询,以便从下一个坏事件开始一个新窗口?
是否可以为窗口中的最后一个事件选择数据?我尝试使用 LAST() 和 LAG() 但它给了我一个编译错误,说“不能在没有聚合函数的情况下使用 GROUP BY”。问题是我不需要聚合函数,只需要最后一个事件值。
我已经被这个问题困扰了好几天,任何帮助将不胜感激。
另外,这是我的第一个问题,所以请原谅我的笨拙