GROUP BY 子句 - Amazon Kinesis Data Analytics

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

GROUP BY 子句

GROUP BY 子句的语法表

(要查看此条款的适用范围,请参见SELECT

例如,按 <column name-or-expression > 进行分组,其中:

  • 表达式可以是集合;而且,

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

此外,除非在聚合中,例如 SUM (allOrdersValue),否则在 GROUP BY 子句中未命名或无法从 GROUP BY 子句派生的列不能出现在 SELECT 语句中。

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

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

GROUP BY 子句根据分组表达式的值对选定行进行分组,为所有列中具有相同值的每组行返回一行摘要信息。

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

直播分组依据

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

单调表达式是指始终朝着相同方向移动的表达 ascends-or-stays-the式:要么相同,要么相同;它不会反向移动。 descends-or-stays 它不必严格升序或严格降序,也就是说,每个值始终高于前一个值或每个值始终低于前一个值。常量表达式属于单调的定义——从技术上讲,它既是升序又是降序——但显然不适合这些目的。有关此问题的更多信息,请参阅单调表达式和运算符

请考虑以下查询:

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 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 可以指定其他分区条款。例如,按楼层分组 (S.ROWTIME) 到 HOUR,USERID 将为每个 USERID 值每小时生成一行输出。如果您知道某个表达式是单调的,则可以使用将其声明为单调的单调函数。如果实际数据不是单调的,则生成的系统行为是不确定的:结果可能不符合预期或期望。

有关更多详细信息,请参阅本指南单调函数中的主题。

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