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 子句中指定或从中派生的列不能在 SELECT 语句中出现,除非是在聚合中,例如 SUM (allOrderValue)。

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

例如:如果表的键位于 GROUP BY 子句中,那么该表的任何列都可以出现在选择列表中,因为在该键的情况下,这些列被视为可访问。

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

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

直播组 BY

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

单调表达式是总是朝同一方向移动的表达式:它要么提升要么保持不变,要么它 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 HUR)是有效的:

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) 到小时将为前一小时的输入行每小时产生一个输出行。GROUP BY 可以指定其他分区术语。例如,按楼层分组 (S.ROWTIME) 到小时,用户 ID 将为每个用户 ID 值每小时产生一个输出行。如果你知道某个表达式是单调的,你可以通过使用单调函数. 如果实际数据不是单调数据,则由此产生的系统行为是不确定的:结果可能不符合预期或期望。

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

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