2

我的输入有一个只有两个值的“条件”字段。让我们只假设值“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    

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

4

1 回答 1

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

于 2016-05-26T01:30:22.413 回答