0

我在使用流分析窗口时遇到了一些问题。我的流分析作业的输入是一个事件流,其中包含来自属于信号的传感器/实体的温度读数。每个信号有大约 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 的新手,老实说,我并不完全了解窗口函数的工作原理。这是我的问题...

  1. 如果我连续 30 分钟收到不良事件(温度大于阈值),然后收到一个好事件,是否可以编写一个查询,以便从下一个坏事件开始一个新窗口?

  2. 是否可以为窗口中的最后一个事件选择数据?我尝试使用 LAST() 和 LAG() 但它给了我一个编译错误,说“不能在没有聚合函数的情况下使用 GROUP BY”。问题是我不需要聚合函数,只需要最后一个事件值。

我已经被这个问题困扰了好几天,任何帮助将不胜感激。

另外,这是我的第一个问题,所以请原谅我的笨拙

4

1 回答 1

0

您可以使用滑动窗口来实现这一点。滑动窗口在每个事件上产生输出,并回顾提供的持续时间。在您的示例中,仅当读数低于阈值 1 小时时才需要输出。像下面这样的查询应该可以工作。

SELECT
    Entity,
    max(Reading) MaxReading
INTO
    [YourOutputAlias]
FROM
    [YourInputAlias]
group by
    Entity,
    SlidingWindow(hour,1)
having
    MaxReading < 100
于 2017-06-26T20:29:21.820 回答