GROUP BY 子句 - Amazon Kinesis Data Analytics
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

GROUP BY 子句

GROUP BY 子句的语法图表

(要查看此子句的适合位置,请参阅SELECT 语句

例如,GROUP BY <column name-or-expression>,其中:

  • 表达式可以是聚合; 并且,

  • 在 GROUP BY 子句中使用的任何列名也必须位于 SELECT 语句中。

此外,未在 GROUP BY 子句中命名或从 GROUP BY 子句派生的列不能在 SELECT 语句中出现,除非是在聚合中(如 SUM (AllORders Value) 中。

可派生的意思是,在 GROUP BY 子句中指定的列允许访问要包含在 SELECT 子句中的列。如果列是可派生的,则 SELECT 语句可以指定该列,即使在 GROUP BY 子句中没有明确命名该列。

例如:如果表的键位于 GROUP BY 子句中,则该表的任何列都可以出现在 select 列表中,因为如果给定该键,则此类列被视为可访问。

GROUP BY 子句基于分组表达式的值为所选行分组,从而针对在所有列中具有相同值的每组行返回一个摘要行信息。

请注意,出于这些目的,NULL 值被视为等于自身,并且不等于任何其他值。这些语义与不区分运算符的语义相同。

流式分组

只要其中一个分组表达式是非常量单调表达式或基于时间的表达式,就可以在流式查询中使用 GROUP BY。此要求对于 Amazon Kinesis Data Analytics 取得进展是必要的,如下所述。

单调表达式是一种总是朝同一方向移动的表达式:它要么上升,要么停留相同,要么下降,要么保持不变;它不会反转方向。它不需要严格升序或严格降序,也就是说,每个值始终高于前一个值,或者每个值总是低于前一个值。常量表达式属于单调的定义范围 — 它在技术上是升序和降序 — 但显然不适用于这些目的。有关单调的更多信息,请参阅单调表达式和运算符.

请考虑以下查询:

SELECT STREAM prodId, COUNT(*) FROM Orders GROUP BY prodId

该查询旨在计算每个产品的订单数量,作为流。但是,由于订单是无限流,因此 Amazon Kinesis Data Analytics 永远不会知道它已经看到了给定商品的所有订单,永远不能完成特定行的总计,因此永远不会输出一行。Amazon Kinesis Data Analytics 验证器拒绝查询,而不是允许永远不会发出行的查询。

GROUP BY 流式处理的语法如下所示:

GROUP BY <monotonic or time-based expression> ,

<column name-or-expression, ...>

,其中 GROUP BY 子句中使用的任何列名都需要在 SELECT 语句中;表达式可以是聚合。此外,未在 GROUP BY 子句中出现的列名称不能在 SELECT 语句中出现,除非是在聚合中,或者,如果对列的访问权限可从您在 GROUP BY 子句中指定的列中创建(如上所示)。

例如,下面的查询(计算每小时的产品计数)使用单调表达式 FLOOR(Orders.RowTime 至小时)因此是有效的:

SELECT STREAM FLOOR(Orders.ROWTIME TO HOUR) AS theHour, prodId, COUNT(*) FROM Orders GROUP BY FLOOR(Orders.ROWTIME TO HOUR), prodId

GROUP BY 中的一个表达式必须是单调或基于时间的。例如,按楼层分组 (S.ROWTIME) 至小时将为前一小时的输入行每小时生成一个输出行。GROUP BY 可以指定其他分区术语。例如,按楼层分组 (S.ROWTIME) 到小时,用户 ID 将每个用户 ID 值每小时产生一个输出行。如果你知道一个表达式是单调的,你可以通过使用单调函数. 如果实际数据不是单调的,则产生的系统行为是不确定的:结果可能不是预期或期望的。

请参阅主题。单调函数,了解更多详细信息。

流中可能出现重复的行时间,只要 ROWTIME 值相同,GROUP BY 操作就会继续积累行。为了发出一行,ROWTIME 值必须在某个时间点更改。