概述

GreptimeDB 提供持续聚合功能允许你实时聚合数据。 当你需要实时计算和查询总和、平均值或其他聚合时,此功能非常有用。 持续聚合功能由 Flow 引擎提供。 它根据传入的数据不断更新聚合数据。

当你将数据插入 source 表时,数据也会被发送到 Flow 引擎并存储在其中。 Flow 引擎通过时间窗口计算聚合并将结果存储在目标表中。 整个过程如下图所示:

Continuous Aggregation

快速开始示例

以下是持续聚合查询的一个完整示例。

首先,使用以下语句创建一个 source 表 numbers_input 和一个 sink 表 out_num_cnt

  1. CREATE TABLE numbers_input (
  2. number INT,
  3. ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  4. PRIMARY KEY(number),
  5. TIME INDEX(ts)
  6. );
  1. CREATE TABLE out_num_cnt (
  2. sum_number BIGINT,
  3. start_window TIMESTAMP TIME INDEX,
  4. end_window TIMESTAMP,
  5. update_at TIMESTAMP,
  6. );

然后创建名为 test_numbers 的 flow 来聚合 numbers_input 表中 number 列的总和,并在 1 秒固定窗口中聚合计算数据。

  1. CREATE FLOW test_numbers
  2. SINK TO out_num_cnt
  3. AS
  4. SELECT sum(number) FROM numbers_input GROUP BY tumble(ts, '1 second', '2021-07-01 00:00:00');

要观察 out_num_cnt 表中持续聚合的结果,向 source 表 numbers_input 插入一些数据。

  1. INSERT INTO numbers_input
  2. VALUES
  3. (20, "2021-07-01 00:00:00.200"),
  4. (22, "2021-07-01 00:00:00.600");

number 列的总和为 42 (20+22),因此 sink 表 out_num_cnt 应该包含以下数据:

  1. SELECT * FROM out_num_cnt;
  1. sum_number | start_window | end_window | update_at
  2. ------------+----------------------------+----------------------------+----------------------------
  3. 42 | 2021-07-01 00:00:00.000000 | 2021-07-01 00:00:01.000000 | 2024-05-17 08:32:56.026000
  4. (1 row)

尝试向 numbers_input 表中插入更多数据:

  1. INSERT INTO numbers_input
  2. VALUES
  3. (23,"2021-07-01 00:00:01.000"),
  4. (24,"2021-07-01 00:00:01.500");

sink 表 out_num_cnt 现在包含两行:分别表示两个 1 秒窗口的数据之和 42 和 47 (23+24) 。

  1. SELECT * FROM out_num_cnt;
  1. sum_number | start_window | end_window | update_at
  2. ------------+----------------------------+----------------------------+----------------------------
  3. 42 | 2021-07-01 00:00:00.000000 | 2021-07-01 00:00:01.000000 | 2024-05-17 08:32:56.026000
  4. 47 | 2021-07-01 00:00:01.000000 | 2021-07-01 00:00:02.000000 | 2024-05-17 08:33:10.048000
  5. (2 rows)

out_num_cnt 表中的列解释如下:

  • sum_number:窗口中 number 列的总和。
  • start_window:窗口的开始时间。
  • end_window:窗口的结束时间。
  • update_at:更新行数据的时间。

其中 start_windowend_windowupdate_at 列是 Flow 引擎的时间窗口函数自动添加的。

下一步

恭喜你已经初步了解了持续聚合功能。 请参考以下章节了解更多:

  • 管理 Flow 描述了如何创建、更新和删除 flow。你的每个持续聚合查询都是一个 flow。
  • 编写查询语句 描述了如何编写持续聚合查询。
  • 定义时间窗口 描述了如何为持续聚合定义时间窗口。时间窗口是持续聚合查询的一个重要属性,它定义了聚合的时间间隔。
  • 表达式 是持续聚合查询中可用表达式。