flinksql窗口join
时间: 2025-04-30 17:55:21 浏览: 17
### Flink SQL 窗口 Join 使用教程
#### TUMBLE 滚动窗口 Join
滚动窗口是一种固定大小的窗口,在每个周期结束时触发计算。这种类型的窗口不会重叠,因此每次只会处理一次落在同一时间段内的事件。
```sql
SELECT
a.key,
SUM(a.value) as sum_a,
AVG(b.value) as avg_b
FROM
TableA a
JOIN
TableB b ON a.key = b.key AND
TUMBLE(a.rowtime, INTERVAL '1' HOUR) =
TUMBLE(b.rowtime, INTERVAL '1' HOUR)
GROUP BY
a.key;
```
此查询将 `TableA` 和 `TableB` 中具有相同键且在同一小时内发生的记录进行连接,并分别求取字段 `value` 的总和与平均值[^1]。
#### HOP 滑动窗口 Join
滑动窗口允许定义一个固定的窗口长度以及滑动步长。这意味着可以设置更细粒度的时间间隔来捕获数据变化情况。
```sql
SELECT
c.customer_id,
COUNT(*) AS purchase_count
FROM
Orders o
JOIN
Customers c ON o.cust_id = c.id AND
HOP(o.order_time, INTERVAL '5' MINUTE, INTERVAL '10' MINUTES) =
HOP(c.update_time, INTERVAL '5' MINUTE, INTERVAL '10' MINUTES)
WHERE
o.status = 'completed'
GROUP BY
c.customer_id;
```
上述例子展示了如何通过每五分钟更新一次、跨度十分钟的方式跟踪客户订单完成次数的变化趋势[^2]。
#### CUMULATE 累积窗口 Join
累积窗口不同于其他两种方式的地方在于它不仅考虑当前时刻之前的全部历史数据,还会随着新到来的数据不断扩展其范围直到达到预设的最大界限为止。
```sql
WITH cumulated_data AS (
SELECT
item_id,
price,
quantity,
CUMULATE(event_time, INTERVAL '1' DAY, INTERVAL '7' DAYS) OVER () AS win_start_end
FROM sales_events
)
SELECT
i.item_name,
s.price * s.quantity AS total_sales
FROM
items i
JOIN
cumulated_data s ON i.id = s.item_id AND
s.win_start_end[1] >= DATE_SUB(CURRENT_DATE(), INTERVAL '8' DAY) AND
s.win_start_end[2] <= CURRENT_DATE()
ORDER BY
total_sales DESC;
```
这段脚本用于分析过去一周内商品销售总额排名前几位的商品列表。
#### Interval Join 时间区间 Join
当涉及到两个无限流之间的关联操作时,可以通过指定时间差来进行过滤,从而实现更加灵活高效的实时数据分析应用。
```sql
SELECT
u.user_id,
p.product_name,
u.action_time,
p.purchase_time
FROM
UserActions u
JOIN
Purchases p ON u.user_id = p.user_id AND
p.purchase_time BETWEEN u.action_time - INTERVAL '1' HOUR AND u.action_time + INTERVAL '1' HOUR
WHERE
u.event_type = 'click';
```
这里展示了一个场景:找出在过去一个小时之内点击过广告链接并且随后购买产品的用户行为模式[^4]。
阅读全文
相关推荐


















