FlinkSQL 中 GROUP BY 和 OVER WINDOW 有何不同?

How GROUP BY and OVER WINDOW differ in FlinkSQL?

可以通过两种不同的方式在 Flink 中使用 windows

SELECT key, MAX(value)
  FROM table
 GROUP BY key, TUMBLE(ts, INTERVAL '5' MINUTE)

SELECT key, MAX(value) OVER w
  FROM table
 WINDOW w AS (PARTITION BY key ORDER BY ts ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

我想知道这两种机制是否可以表达相同的东西,或者两者的主要区别和可能的用例是什么?

两个查询计算出与正则SQL 语义相对应的不同结果。因此,差异不是 Flink 特定的,而是由 SQL 标准定义的。


第一次查询

SELECT key, MAX(value)
  FROM table
 GROUP BY key, TUMBLE(ts, INTERVAL '5' MINUTE)

key 和 5 分钟桶对记录进行分组。查询每 5 分钟为每个 key 值生成一行,最大值为 value。对于每个组,多行聚合为一行。


第二次查询

SELECT key, MAX(value) OVER w
  FROM table
 WINDOW w AS (PARTITION BY key ORDER BY ts ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

为输入的每一行生成一行 (table)。结果行具有迄今为止观察到的 key 值的最大值 value(行按 ts 排序)。请注意,多行不会聚合为一行;每个输入行产生一个输出行。而且,最大聚合的范围可以超过5分钟。事实上,在这个例子中它是整个 key 分区。