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

Only output events for a condition when at least a single event matching the condition has been found, else output the input

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

当在翻滚 window 中至少找到一个 condition=A 的事件时,仅应输出 condition=A 的事件。但是,当没有找到 A 的事件时,在同一个 window 中只输出 B 的事件。 给定以下具有 4 个刻度的翻滚 window 的输入:

  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    

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

这是一个有趣的问题。 首先请允许我更正您对 window 的定义。 Windows 时间范围从 0 到 16 的 4 个刻度是:

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

,其中不包括开始时间,包括结束时间。结束时间是window.

计算结果的时间戳

下面是计算答案的查询。

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 步骤计算 window 中 A 的数量。这将在 window 的每一端(在此示例中为 4、8、12 和 16 秒)产生一个事件,其中包含在最后 4 秒内看到的 A 的计数。

然后我们用 input 加入它,但只有最后 4 秒。 我们需要小心定义时间范围(又名摆动空间)以正确对齐 window 边界。因此使用 >=0 and <4 而不是 between.