本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
聚合函数
聚合函数不是返回从单行计算的结果,而是返回根据有限行集合中包含的聚合数据或有关有限行集的信息计算的结果。聚合函数可能出现在以下任何一种中:
-
SELECT 子句的 <selection list> 部分
聚合函数与不同分析函数,聚合函数总是相对于必须指定的窗口进行求值,因此它们不能出现在 HAVING 子句中。其他差异见下表。
聚合函数在表的聚合查询中的操作与在流的聚合查询中使用聚合函数的操作略有不同,如下所示。如果对表的聚合查询包含 GROUP BY 子句,则聚合函数在输入行集合中每组返回一个结果。缺少显式的 GROUP BY 子句等同于 GROUP BY (),并且只返回整组输入行的一个结果。
在流中,聚合查询必须包含基于行时间的单调表达式的显式 GROUP BY 子句。如果没有,唯一的群组就是整个直播,直播永远不会结束,因此无法报告任何结果。根据单调表达式添加 GROUP BY 子句会将数据流分成有限的行集,这些行集在时间上是连续的,然后可以聚合和报告每个这样的行集。
每当到达更改单调分组表达式值的行时,就会启动一个新组,并认为前一组已完成。然后,Amazon Kinesis Data Analytics 应用程序输出聚合函数的值。请注意,GROUP BY 子句还可能包含其他非单调表达式,在这种情况下,每组行可能会产生多个结果。
对流执行聚合查询通常称为流式聚合,不同于分析函数和中讨论的窗口化聚合直播上的窗口聚合。有关 stream-to-stream 联接的更多信息,请参阅加入条款。
如果输入行null
在用作数据分析函数输入的列中包含 a,则数据分析函数会忽略该行(COUNT 除外)。
流式聚合和行时边界
通常,聚合查询会在到达一行时生成结果,该行更改 GROUP BY 中单调表达式的值。例如,如果查询按 FLOOR(行时到分钟)分组,并且当前行的行时间为 9:59 .30,则行时间为 10:00 .00 的新行将触发结果。
或者,可以使用行时绑定来推进单调表达式并使查询能够返回结果。例如,如果查询按 FLOOR(行时到分钟)分组,并且当前行的行时间为 9:59 .30,则传入的行时间界限为 10:00 .00,则查询将返回结果。
聚合函数表
Amazon Kinesis Data Analytics es
以下 SQL 使用 AVG 聚合函数作为查询的一部分来查找所有员工的平均年龄:
SELECT AVG(AGE) AS AVERAGE_AGE FROM SALES.EMPS;
结果:
平均年龄 |
---|
38 |
为了找到每个部门员工的平均年龄,我们可以在查询中添加一个明确的 GROUP BY 子句:
SELECT DEPTNO, AVG(AGE) AS AVERAGE_AGE FROM SALES.EMPS GROUP BY DEPTNO;
返回值:
DEPTNO | 平均年龄 |
---|---|
10 |
30 |
20 |
25 |
30 |
40 |
40 |
57 |
流上的聚合查询示例(流式聚合)
在此示例中,假设下表中的数据流经名为 WEATHERSTREAM 的流。
ROWTIME | CITY | TEMP |
---|---|---|
2017 年 11 月 1 日 |
丹佛 |
29 |
2017 年 11 月 1 日 |
安克雷奇 |
2 |
2017 年 11 月 1 日 |
迈阿密 |
65 |
2017 年 11 月 1 日 |
丹佛 |
32 |
2017 年 11 月 1 日 |
安克雷奇 |
9 |
2018-11-01 |
丹佛 |
50 |
2017 年 11 月 1 日 |
安克雷奇 |
10 |
2017 年 11 月 1 日 |
迈阿密 |
71 |
2018-11-0 |
丹佛 |
43 |
2017 年 11 月 2 |
安克雷奇 |
4 |
2017 年 11 月 2 |
丹佛 |
39 |
2017 年 11 月 2 |
丹佛 |
46 |
2017 年 11 月 2 |
安克雷奇 |
3 |
2018-11-0 |
丹佛 |
56 |
2017 年 11 月 2 |
安克雷奇 |
2 |
2018-11-0 |
丹佛 |
50 |
2018-11-0 |
丹佛 |
36 |
2018-11-0 |
安克雷奇 |
1 |
如果您想查找每天任何地方记录的最低和最高温度(全球范围不分城市),则可以分别使用聚合函数 MIN 和 MAX 来计算最低和最高温度。要表示我们每天需要此类信息(以及要提供单调表达式作为 GROUP BY 子句的参数),我们使用 FLOOR 函数将每个行的行时间向下取整为最近一天:
SELECT STREAM FLOOR(WEATHERSTREAM.ROWTIME to DAY) AS FLOOR_DAY, MIN(TEMP) AS MIN_TEMP, MAX(TEMP) AS MAX_TEMP FROM WEATHERSTREAM GROUP BY FLOOR(WEATHERSTREAM.ROWTIME TO DAY);
聚合查询的结果见下表。
楼层_DAY | 最小温度 | 最大温度 |
---|---|---|
2018-11-01 00:00:00 .0 |
2 |
71 |
2017 年 11 月 2 |
2 |
56 |
尽管示例数据确实包括当天的温度测量值,但没有2018-11-03的行。这是因为 2018-11-03 的行在已知当天的所有行都已到达之前无法聚合,而且只有当行时为 2018-11-04 00:00:00 .0(或更高版本)或行时界限为 2018-11-04 00:00:00 .0(或更高版本)的行到达时,才会聚合。如果其中任何一个都到达,则下一个结果将如下表所述。
楼层_DAY | 最小温度 | 最大温度 |
---|---|---|
2018-11-03 00:00:00 .0 |
1 |
36 |
假设我们不想找到每天的全球最低和最高温度,而是想找到每个城市每天的最低、最高和平均温度。为此,我们使用 SUM 和 COUNT 聚合函数来计算平均值,并将 CITY 添加到 GROUP BY 子句中,如下所示:
SELECT STREAM FLOOR(WEATHERSTREAM.ROWTIME TO DAY) AS FLOOR_DAY, CITY, MIN(TEMP) AS MIN_TEMP, MAX(TEMP) AS MAX_TEMP, SUM(TEMP)/COUNT(TEMP) AS AVG_TEMP FROM WEATHERSTREAM GROUP BY FLOOR(WEATHERSTREAM.ROWTIME TO DAY), CITY;
聚合查询的结果见下表。
楼层_DAY | CITY | 最小温度 | 最大温度 | 平均温度 |
---|---|---|---|---|
2018-11-01 00:00:00 .0 |
安克雷奇 |
2 |
10 |
7 |
2018-11-01 00:00:00 .0 |
丹佛 |
29 |
50 |
38 |
2018-11-01 00:00:00 .0 |
迈阿密 |
65 |
71 |
68 |
2017 年 11 月 2 |
安克雷奇 |
2 |
4 |
3 |
2017 年 11 月 2 |
丹佛 |
39 |
56 |
47 |
在这种情况下,新一天温度测量行的到来会触发前一天的数据聚合,按城市分组,然后生成当天测量值中包含的每个城市一行。
同样,在下表显示了2018-11-04的任何实际测量值之前,可以使用行时界限2018-11-04 00:00:00 .0 来提示2018-11-03的结果。
楼层_DAY | CITY | 最小温度 | 最大温度 | 平均温度 |
---|---|---|---|---|
2018-11-03 00:00:00 .0 |
安克雷奇 |
1 |
1 |
1 |
2018-11-03 00:00:00 .0 |
丹佛 |
36 |
36 |
36 |