Apache flink FlinkSQL中按窗口和窗口上方分组的差异如何?

Apache flink FlinkSQL中按窗口和窗口上方分组的差异如何?,apache-flink,flink-sql,Apache Flink,Flink Sql,人们可以用两种不同的方式在Flink中使用窗口 SELECT key, MAX(value) FROM table GROUP BY key, TUMBLE(ts, INTERVAL '5' MINUTE) 及 我想知道这两种机制是否可以表达相同的东西,或者两者的主要区别和可能的用例是什么?两个查询都计算出与常规SQL语义相对应的不同结果。因此,区别不是Flink特有的,而是由SQL标准定义的 第一个问题 SELECT key, MAX(value) FROM table GRO

人们可以用两种不同的方式在Flink中使用窗口

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


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

两个查询都计算出与常规SQL语义相对应的不同结果。因此,区别不是Flink特有的,而是由SQL标准定义的


第一个问题

SELECT key, MAX(value)
  FROM table
 GROUP BY key, TUMBLE(ts, INTERVAL '5' MINUTE)
键和5分钟桶分组记录。查询每5分钟为每个
值生成一行,最大值为
。对于每个组,多行聚合为一行


第二个问题

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

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

如果我使用LAST_VALUE(VALUE)而不是MAX会怎么样?它与SELECT key、value from table有什么不同吗?它与MAX()有相同的差异。带有OVER/WINDOW的查询仍然会为每个输入行生成一个输出行,“聚合范围”也是键分区的完整过去,而不是键的5分钟窗口。
SELECT key, MAX(value) OVER w
  FROM table
 WINDOW w AS (PARTITION BY key ORDER BY ts ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)