我的输入有字段'条件'只有两个值。让我们假设只有值' 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
如何设置我的步骤以便从输入中获得以下输出? 我尝试了几个使用组的选项但是没有成功
答案 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
。