仅在找到与条件匹配的至少一个事件时输出条件,否则输出输入

时间:2016-05-18 13:51:53

标签: azure azure-stream-analytics

我的输入有字段'条件'只有两个值。让我们假设只有值' A'或者' B'。

当找到在翻滚窗口内具有条件= A的至少单个事件时,仅输出条件= A的事件。但是,当没有找到A的事件时,只应在同一窗口中输出带有B的事件。 鉴于以下输入具有4个刻度的翻滚窗口:

  Condition   Time  
 ----------- ------ 
  A           T1    
  B           T2    
  A           T3    
  B           T5    
  B           T6    
  B           T7    
  B           T8    
  B           T10   
  A           T11   
  A           T12   
  A           T13   
  A           T14   
  A           T15   

输出应如下:

  Condition   Time   (Window)  
 ----------- ------ ---------- 
  A           T1     T1-3      
  A           T3     T1-3      
  B           T5     T5-8      
  B           T6     T5-8      
  B           T7     T5-8      
  B           T8     T5-8      
  A           T11    T9-12     
  A           T12    T9-12     
  A           T13    T13-16    
  A           T14    T13-16    
  A           T15    T13-16    

如何设置我的步骤以便从输入中获得以下输出? 我尝试了几个使用组的选项但是没有成功

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。 首先,请允许我更正窗口的定义。时间范围从0到16的4个滴答的窗口是:

( 0 -  4]
( 4 -  8]
( 8 - 12]
(12 - 16]

,其中排除开始时间并包括结束时间。结束时间是该窗口计算结果的时间戳。

现在这是一个计算你答案的查询。

WITH
count_as as (
    SELECT
        cnt = SUM(case cond when 'A' then 1 else 0 end)
    FROM input TIMESTAMP BY time
    GROUP BY tumblingwindow(second, 4)
)

SELECT
    input.cond, input.time
FROM
    count_as a
      JOIN
    input TIMESTAMP BY time
      ON DATEDIFF(second, input, a) >= 0 AND DATEDIFF(second, input, a) < 4
WHERE
    (a.cnt > 0 AND input.cond = 'A')
    OR
    (a.cnt = 0 AND input.cond = 'B')

count_as步骤计算窗口中A的数量。这将在窗口的每一端产生一个事件(在本例中为4,8,12和16秒),并在最后4秒内看到A的计数。

然后我们只用input加回来,但只持续4秒。 我们需要小心定义时间边界(也就是摆动空间)以正确对齐窗口边界。因此,使用>=0 and <4而不是between