如何使用窗口函数解决azure流分析中的问题
col1 | col2 | 状态 | 旗帜 |
---|---|---|---|
Q1 | P1 | 开始了 | 1 |
Q1 | P1 | 已连接 | 1 |
Q1 | P1 | 结束了 | 0 |
Q1 | P1 | 已完成 | 0 |
Q1 | P2 | 开始了 | 1 |
Q1 | P2 | 已连接 | 1 |
Q1 | P2 | 结束了 | 0 |
Q1 | P2 | 已完成 | 0 |
Q2 | P3 | 开始了 | 1 |
Q2 | P3 | 已连接 | 1 |
O/p:
我们需要聚合第1列和第2列。如果第3列包含诸如ended或completed之类的值,我们应该将第2列中的相应值视为0。如果第3列包含诸如started或connected之类的值,我们应该考虑相应的值第 2 列中的值为 1。最后,我们需要对所有行的第 2 列中的值进行求和。
col1 | 数 |
---|---|
Q1 | 0 |
Q2 | 1 |
我能够使用滑动窗口计算 col2 级别的最小值。然而,当我尝试使用滑动窗口在 col2 级别执行聚合时,它执行的是累积和。
with min_val as (
select col1,
col2,
min(flag) as val
from cte
group by col1,col2, slidingwindow(day,1))
select col1
,sum(val)
from min_val
group by col1, slidingwindow(day,1) -- This sliding window is doing cummulative sum
您可以使用
TumblingWindow(minute, 1)
作为聚合函数来按所需列进行分组。这会将所有的 col1, col2 行分组,然后您可以知道当前组是否已完成或仍在连接中。
select col1,
col2,
GetArrayElement(collect(flag),GetArraylength(collect(flag))-1) as count
from <your_input>
group by col1,col2, TumblingWindow(minute, 1);
collect()
将以相同的顺序收集组中的所有 flag
行。因此,如果您获取 collect(flag)
数组中的最后一个值,那么它将给出当前组的状态,如下所示。