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

GROUP BY 子句

GROUP BY 子句的语法图

(要了解此子句适用的地方,请参阅 SELECT 语句)

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

  • 表达式可以为聚合;并且

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

此外,不是在 GROUP BY 子句中指定或不可从中派生的列不能出现在 SELECT 语句中,但在聚合 (如 SUM (allOrdersValue)) 中除外。

可派生是指 GROUP BY 子句中指定的列支持访问您要包含在 SELECT 子句中的列。如果某个列可派生,则 SELECT 语句可以指定该列,即使 GROUP BY 子句中没有显式指定。

示例:如果某个表的键在 GROUP BY 子句中,则该表的任意列均可出现在选择列表中,因为有了该键,此类列将被视为可访问。

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

请注意,出于这些目的,值 NULL 将被视为等于其本身而不等于任何其他值。这些是与 IS NOT DISTINCT FROM 运算符的相同的语义。

流式 GROUP BY

GROUP BY 可在流式查询中使用,只要分组表达式是非常量单调表达式或基于时间的表达式。必须满足此要求,Amazon Kinesis Data Analytics 才能执行,如下所述。

单调表达式是始终向相同的方向移动的表达式:它可以上升或保持不变,也可以下降或保持不变;但不能反向移动。它不需要采用严格升序或严格降序,即,每个值始终高于前一个值或始终低于前一个值。常量表达式符合单调表达式的定义 (从技术上而言,它既是升序也是降序),但它很明显不适合这些目的。有关单调性的更多信息,请参阅单调表达式和运算符

请考虑以下查询:

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

该查询旨在以流的形式计算每个产品的订单数。但是,由于 Orders 是一个无限流,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 TO HOUR) 计算每小时产品计数的以下查询因此是有效的:

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

GROUP BY 中的表达式之一必须为单调表达式或基于时间的表达式。例如 GROUP BY FLOOR(S.ROWTIME) TO HOUR 将每小时针对前一小时的输入行生成一个输出行。GROUP BY 可指定其他分区词。例如,GROUP BY FLOOR(S.ROWTIME) TO HOUR, USERID 将每小时为每个 USERID 值生成一个输出行。如果您知道某个表达式是单调表达式,则可以使用单调函数对其进行声明。如果实际数据不是单调的,则生成的系统行为将不确定:结果可能不符合预期或需要。

请参阅本指南中的主题单调函数以了解更多详细信息。

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