本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
GROUP BY 子句
GROUP BY 子句的语法表
(要了解该条款的适用范围,请参阅SELECT)
例如,GROUP BY <column name-or-expression>,其中:
表达式可以是聚合;而且,
GROUP BY 子句中使用的任何列名也必须在 SELECT 语句中。
此外,未在 GROUP BY 子句中命名或衍生自 GROUP BY 子句的列不能出现在 SELECT 语句中,除非出现在聚合中,例如 SUM (allOrdersValue)。
可导出的意思是,在 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 验证器不允许一个永远无法发出一行的查询,而是拒绝该查询。
Grop By for more details.
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 值每小时将生成一个输出行。如果你知道一个表达式是单调的,你可以使用单调函数. 如果实际数据不是单调的,则由此产生的系统行为是不确定的:结果可能不符合预期或预期。
参见主题单调函数有关更多信息,请参阅。
流中可能会出现重复的行时间,只要 ROWTIME 值相同,GROUP BY 操作就会继续累积行。为了发出一行,ROWTIME 值必须在某个时候发生变化。