我的输入有一个“条件”字段,只有两个值。让我们只假定值'A‘或'B’。
当在滚动窗口中找到至少一个带有condition=A的事件时,应该只输出带有condition=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 如何设置我的步骤,以便从我的输入中获得以下输出?我尝试了几种使用组的方法,但都失败了。
发布于 2016-05-26 01:30:22
这是个有趣的问题。首先,请允许我更正您对窗口的定义。从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。
https://stackoverflow.com/questions/37301666
复制相似问题