文档下载建议反馈入口

  • 简单查询
  • 插值查询
  • 最值上下文查询

时序数据查询

时序数据库支持使用 SQL 语句执行简单查询、嵌套查询、关联查询、联合查询、插值查询和最值上下文查询。有关嵌套查询、关联查询、联合查询的语法说明,参见 SQL 参考

简单查询

前提条件

用户是 admin 角色的成员或者拥有目标表的 SELECT 权限。默认情况下,root 用户属于 admin 角色。

语法格式

有关时序数据查询的语法格式,参见 SQL 参考

参数说明

有关时序数据查询的参数说明,参见 SQL 参考

语法示例

  • 查询时序表的数据。

    以下示例假设经创建 ts_db 数据库。以下示例查询 t1 时序表的数据。

    -- 1. 创建 t1 时序表并写入数据。
    
    CREATE TABLE ts_db.t1(ts timestamp not null,a int, b int) tags(tag1 int not null, tag2 int) primary tags(tag1);
    
    -- 2. 向表中写入数据。
    
    INSERT INTO ts_db.t1 VALUES(now(),11,11,33,44);
    INSERT INTO ts_db.t1 VALUES(now(),22,22,33,44);
    INSERT INTO ts_db.t1 VALUES(now(),11,33,33,44);
    INSERT INTO ts_db.t1 VALUES(now(),22,44,33,44);
    INSERT INTO ts_db.t1 VALUES(now(),33,55,44,44);
    INSERT INTO ts_db.t1 VALUES(now(),22,44,44,44);
    INSERT INTO ts_db.t1 VALUES(now(),33,44,55,44);
    INSERT INTO ts_db.t1 VALUES(now(),null,null,66,66);
    INSERT INTO ts_db.t1 VALUES(now(),null,null,66,77);
    
    -- 3. 查看表的内容。
    
    SELECT * FROM t1;
                  ts               |  a   |  b   | tag1 | tag2
    --------------------------------+------+------+------+-------
      2024-02-26 01:28:28.867+00:00 |   11 |   11 |   33 |   44
      2024-02-26 01:28:28.874+00:00 |   22 |   22 |   33 |   44
      2024-02-26 01:28:28.877+00:00 |   11 |   33 |   33 |   44
      2024-02-26 01:28:28.88+00:00  |   22 |   44 |   33 |   44
      2024-02-26 01:28:28.883+00:00 |   33 |   55 |   44 |   44
      2024-02-26 01:28:28.885+00:00 |   22 |   44 |   44 |   44
      2024-02-26 01:28:28.888+00:00 |   33 |   44 |   55 |   44
      2024-02-26 01:28:28.89+00:00  | NULL | NULL |   66 |   66
      2024-02-26 01:28:28.893+00:00 | NULL | NULL |   66 |   66
    (9 rows)
    
  • 查询指定的数据列。

    以下示例查询 t1 表的 a 列并进行求和。

    SELECT sum(a) FROM ts_db.t1;
      sum
    -------
      154
    (1 row)
    
  • 去重查询。

    以下示例对 t1 表的 a 列进行去重查询。

    SELECT DISTINCT a FROM ts_db.t1;
      a
    --------
        11
        22
        33
      NULL
    (4 rows)
    
  • 使用 WHERE 语句过滤标签列。

    以下示例使用 WHERE 语句过滤 t1 表的 a 列。

    SELECT tag1 FROM ts_db.t1 WHERE a =11;
      tag1
    --------
        33
        33
    (2 rows)
    
  • 使用 GROUP BYORDER BY 语句对数据列进行分类和排序。

    以下示例使用 GROUP BY 语句对 t1 表的 a 列进行分类和排序。

    SELECT a, max(b) FROM ts_db.t1 GROUP BY a ORDER BY a;
      a   | max
    -------+-------
      NULL | NULL
        11 |   33
        22 |   44
        33 |   55
    (4 rows)
    

插值查询

时间序列数据中,有时会存在缺失和偏离的数据,影响后续数据的使用和分析。KaiwuDB 支持以下两种插值查询方式:

  • 时间桶插值查询:使用 time_bucket_gapfill() 函数,面向时间范围的批量插值,按固定时间间隔生成完整时间序列,适用于趋势分析、报表补全等场景。
  • FILL 子句查询:使用 FILL 子句,面向精确时间点的单次取值,在该时间点无数据时按指定策略返回补充值,适用于工业测点数据的实时查询场景。

时间桶插值查询

KaiwuDB 提供了 time_bucket_gapfill() 函数和 interpolate() 函数,支持用户对指定时间范围内按固定时间间隔进行时间戳对齐,插入缺失的时间戳行,并根据需要选择是否进行补值。

KaiwuDB 的插值函数支持与以下功能联合使用:

  • LIMIT:限制插值和补值后返回的结果集数量。
  • LIMIT...OFFSET:限制插值和补值后返回的结果集数量,并跳过指定行数的记录。
  • 子查询:包括非相关 FROM 子查询以及相关和非相关 WHERE 子查询,子查询中的表可以是时序表或关系表。
  • JOIN:包括 JOINFULL JOINLEFT JOINRIGHT JOIN,插值查询与 JOIN 联合使用时,会先执行 JOIN 操作,然后对结果进行插值处理。
  • UNION:包括 UNIONUNION ALL,插值查询与 UNION 联合使用时,每个子查询或数据集会先进行插值处理,然后再合并结果。

说明

  • time_bucket_gapfill() 函数必须与 GROUP BY 配合使用。
  • 如果需要同时查询其他列信息,且待查询的列不在 GROUP BY 指定的范围内,需要使用聚合函数来处理这些列。例如,系统不支持 SELECT time_bucket_gapfill(time, 86400) AS a, c1 FROM t1 GROUP BY a;,但支持 SELECT time_bucket_gapfill(time, 86400) AS a, max(c1) FROM t1 GROUP BY a;

前提条件

用户是 admin 角色的成员或者拥有目标表的 SELECT 权限。默认情况下,root 用户属于 admin 角色。

语法格式

  • 插入缺失时间戳行但不补值

    SELECT time_bucket_gapfill(<timestamp_column>, <interval>) AS <alias_1> 
    FROM <table_name> 
    GROUP BY <column_list_1> 
    [ORDER BY <column_list_2>] 
    [LIMIT <n>] 
    [OFFSET <m>];
    
  • 插入缺失时间戳行并进行补值

    SELECT time_bucket_gapfill(<timestamp_column>, <interval>) AS <alias_1>, 
          interpolate(<expression_1>, <expression_2>) [AS <alias_2>] 
    FROM <table_name> 
    GROUP BY <column_list_1> 
    [ORDER BY <column_list_2] 
    [LIMIT <n>] 
    [OFFSET <m>];
    

参数说明

参数说明
timestamp_column时间戳列。
interval时间间隔,支持的单位包括纳秒、微秒、毫秒、秒、分、小时、天、周、月、年。目前,KaiwuDB 不支持复合时间格式,如 1d1h
各时间单位支持的输入格式如下所示:
- 纳秒:nsnsecnsecsnanosecondnanoseconds
- 微秒:ususecusecsmicrosecondmicroseconds
- 毫秒:msmsecmsecsmillisecondmilliseconds
- 秒:ssecsecssecondseconds
- 分:mminminsminuteminutes
- 小时:hhrhrshourhours
- 天:ddaydays
- 周:wweekweeks
- 月:monmonsmonthmonths
- 年:yyryrsyearyears
alias_1为生成的时间桶结果起的别名,便于后续引用。
table_name待查询表的名称。
column_list_1用于分组的列或列的组合。多个列之间使用逗号(,)分隔。KaiwuDB 会将除时间列外的其余列作为一组,进行组内补行,组与组之间互不影响。
column_list_2用于排序的列或列的组合,多个列之间使用逗号(,)分隔。支持添加可选的关键字 ASCDESC, 指定顺序为升序或降序,默认值为 ASC,即升序。
n可选参数,指定返回结果的最大行数。
m可选参数,跳过前面 m 行结果。OFFSET 需与 LIMIT 连用。
expression_1补值算法,必须是聚合函数且数据类型为数值。
expression_2补值模式,支持常量值(constant)、前值(prev)、后值(next)、线性值(linear)和 NULL。补值结果类型应与原始值一致。
alias_2可选参数,为补值结果起的别名,便于后续引用。

语法示例

以下示例假设用户已创建时序表 t1, t2, 并向表内写入对应的数值。

-- 创建表 t1, 并向表内写入数据
create table t1(time timestamp not null,  temperature DOUBLE, humidity DOUBLE) tags(device_id int not null) primary tags(device_id);
INSERT INTO t1 (time, device_id, temperature, humidity) VALUES ('2024-08-01 12:00:00', 1, 25.3, 60.2);
INSERT INTO t1 (time, device_id, temperature, humidity) VALUES ('2024-09-01 12:00:00', 2, 25.6, 60.3);

-- 创建表 t2, 并向表内写入数据
create table t2(time timestamp not null,  temperature DOUBLE, humidity DOUBLE) tags(device_id int not null) primary tags(device_id);
INSERT INTO t2 (time, device_id, temperature, humidity) VALUES ('2024-08-01 12:00:00', 1, 25.3, 60.2);
INSERT INTO t2 (time, device_id, temperature, humidity) VALUES ('2024-09-01 12:00:00', 2, 25.6, 60.3);
  • 插入缺失的时间戳行但不补值。

    以下示例对 t1 表进行插值查询,但不补值。

    SELECT time_bucket_gapfill (time, 86400) AS tt FROM t1 GROUP BY tt ORDER BY tt;
                tt
    -----------------------------
      2024-08-01 00:00:00+00:00
      2024-08-02 00:00:00+00:00
      2024-08-03 00:00:00+00:00
      2024-08-04 00:00:00+00:00
      2024-08-05 00:00:00+00:00
      2024-08-06 00:00:00+00:00
      2024-08-07 00:00:00+00:00
      2024-08-08 00:00:00+00:00
      ...
    (32 rows)
    
  • 插入缺失的时间戳行并使用前值补值。

    以下示例对 t1 表进行插值查询,并使用前值(PREV)补值。

     SELECT time_bucket_gapfill(time, 86400) AS tt, interpolate(avg(temperature), PREV) FROM t1 GROUP BY tt ORDER BY tt;
                tt             | interpolate
    ----------------------------+--------------
      2024-08-01 00:00:00+00:00 |        25.3
      2024-08-02 00:00:00+00:00 |        25.3
      2024-08-03 00:00:00+00:00 |        25.3
      2024-08-04 00:00:00+00:00 |        25.3
      2024-08-05 00:00:00+00:00 |        25.3
      2024-08-06 00:00:00+00:00 |        25.3
      2024-08-07 00:00:00+00:00 |        25.3
      2024-08-08 00:00:00+00:00 |        25.3
      ...
    (32 rows)
    
  • 插入缺失的时间戳行,使用常量补值,并使用 limitoffset 限制补值后返回的结果集。

    以下示例对 t1 表进行插值查询,使用常量补值后,限制返回的结果为 8 行,同时跳过前两行结果。

    SELECT time_bucket_gapfill(time, 86400) AS tt, interpolate(avg(temperature), '25') FROM t1 GROUP BY tt ORDER BY tt limit 8 offset 2;
              tt             | interpolate
    ----------------------------+--------------
    2024-08-03 00:00:00+00:00 |          25
    2024-08-04 00:00:00+00:00 |          25
    2024-08-05 00:00:00+00:00 |          25
    2024-08-06 00:00:00+00:00 |          25
    2024-08-07 00:00:00+00:00 |          25
    2024-08-08 00:00:00+00:00 |          25
    2024-08-09 00:00:00+00:00 |          25
    2024-08-10 00:00:00+00:00 |          25
    (8 rows)
    
  • 插值查询与 FROM 子查询联合使用。

    以下示例在子查询中先对原始数据进行每日(1 day)的分组和插值操作,然后在外层查询中按两天(2 day)的时间窗口再次进行分组和插值操作。

    select time_bucket_gapfill(tt, 2 * 86400) as c,interpolate(count(b), null) from (select time_bucket_gapfill(time,86400) as tt,interpolate(max(device_id),linear) as b from t1 group by tt order by tt ) group by c order by c;
                  c             | interpolate
    ----------------------------+--------------
      2024-08-01 00:00:00+00:00 |           2
      2024-08-03 00:00:00+00:00 |           2
      2024-08-05 00:00:00+00:00 |           2
      2024-08-07 00:00:00+00:00 |           2
      2024-08-09 00:00:00+00:00 |           2
      2024-08-11 00:00:00+00:00 |           2
    ...
    (16 rows)
    
  • 插值查询与 WHERE 子查询联合使用。

    以下示例先找出 t1 表中最大的时间戳,然后筛选出 t1 表中所有时间戳大于该最大时间戳的记录。

    select * from t1 where time> (select time_bucket_gapfill(time,86400) as tb from t1 group by tb order by tb desc limit 1) order by time;
    time                   |temperature|humidity|device_id|
    -----------------------|-----------|--------|---------|
    2024-09-01 12:00:00.000|       25.6|    60.3|        2|
    (1 row)
    
  • 使用联合查询各自补值后再合并结果。

    以下示例将两个表 t1 和 t2 的插值结果合并。

    SELECT time_bucket_gapfill(time, 86400) AS a, interpolate(avg(temperature), 'linear') FROM t1 GROUP BY a UNION ALL SELECT time_bucket_gapfill(time, 86400) AS a, interpolate(avg(temperature), 'linear') FROM t2 GROUP BY a limit 8;
        a                  |interpolate       |
    -----------------------|------------------|
    2024-08-01 00:00:00.000|              25.3|
    2024-08-02 00:00:00.000|25.309677419354838|
    2024-08-03 00:00:00.000| 25.31935483870968|
    2024-08-04 00:00:00.000|25.329032258064515|
    2024-08-05 00:00:00.000|25.338709677419356|
    2024-08-06 00:00:00.000|25.348387096774193|
    2024-08-07 00:00:00.000|25.358064516129033|
    2024-08-08 00:00:00.000| 25.36774193548387|
    (8 rows)
    

FILL 子句查询

KaiwuDB 支持使用 FILL 子句对指定时间点的测点数据进行单点查询,并在该时间点无数据时按指定策略返回补充值。

说明

  • WHERE 子句必须存在,且只能包含主标签和时间戳精确匹配条件,不支持模糊查询。
  • 无论使用哪种补值策略,返回结果的时间戳始终是 WHERE 子句中指定的时间点,而非补值来源数据的实际时间戳。

前提条件

用户是 admin 角色的成员或者拥有目标表的 SELECT 权限。默认情况下,root 用户属于 admin 角色。

语法格式

SELECT <column_name> FROM <table_name>
  WHERE <ptag_name> = '<ptag_value>' AND <ts_column_name> = '<timestamp_value>'
  FILL (EXACT | PREVIOUS [, <before_range>] | NEXT [, <after_range>] | CLOSER [, <close_range>] | LINEAR [, <before_range> [, <after_range>]] | CONSTANT, <const>)

参数说明

参数说明
column_name查询列,只允许使用单列,不支持表达式。
table_name查询表,只允许使用单表,不支持子查询。
ptag_name主标签名,只支持精确匹配,不支持模糊查询。
ptag_value主标签值,字符串类型。格式为 'value'
ts_column_name时间戳列名,只支持精确匹配。
timestamp_value时间戳列的匹配值,格式为 'YYYY-MM-DD HH:MM:SS[.mmm]'
EXACT精确填充。如果查询时间点无数据,返回 NULL,时间戳为查询时间。
PREVIOUS前值填充。如果查询时间点无数据,返回之前时间点最新的一个有效值。设置 before_range 时,在 [T - before_range, T] 区间内查找;区间内无有效值则返回 NULL。
NEXT后值填充。如果查询时间点无数据,返回之后时间点最近的一个有效值。设置 after_range 时,在 [T, T + after_range] 区间内查找;区间内无有效值则返回 NULL。
CLOSER最近值填充。如果查询时间点无数据,返回前后时间点中距查询时间最近的有效值;前后距离相等时取前值。设置 close_range 时,在 [T - close_range, T + close_range] 区间内查找;区间内无有效值则返回 NULL。
CONSTANT常量填充。如果查询时间点无数据,用指定常量替换所有类型兼容的数据列。常量类型与列类型不兼容,或类型宽度超出列范围时返回 NULL。
LINEAR线性插值填充。如果查询时间点无数据,找该时间点前后各一个最近的有效值,根据时间距离按比例估算出一个补值。只适用于数值类型。如果前后任意一侧没有有效值,返回 NULL。设置 before_rangeafter_range 时,分别限定向前和向后的查找范围。
before_range可选参数,整数常量,单位 ms。指定向前查找的时间窗口范围。取值必须大于等于 0,否则报错。
after_range可选参数,整数常量,单位 ms。NEXT 策略指定向后查找范围;LINEAR 策略指定向后查找范围(before_range 指定向前)。取值必须大于等于 0,否则报错。
close_range可选参数,整数常量,单位 ms。CLOSER 策略指定前后查找范围。取值必须大于等于 0,否则报错。
const常量填充值,用于 CONSTANT 策略。支持 BOOL、INT、FLOAT、字符串类型,实际可填充的列类型由运行时兼容性决定。

各数据类型支持的填充方式如下表所示:

数据类型支持的填充方式
BOOLEXACT、PREVIOUS、NEXT、CLOSER、CONSTANT
INT2、INT4、INT8EXACT、PREVIOUS、NEXT、CLOSER、CONSTANT、LINEAR
FLOAT4、FLOAT8EXACT、PREVIOUS、NEXT、CLOSER、CONSTANT、LINEAR
CHAR、NCHAR、VARCHAR、NVARCHAREXACT、PREVIOUS、NEXT、CLOSER、CONSTANT
VARBYTESEXACT、PREVIOUS、NEXT、CLOSER、CONSTANT

语法示例

以下示例假设用户已创建时序数据库 ts_db 并执行以下建表和写入操作:

CREATE TS DATABASE ts_db;
USE ts_db;
CREATE TABLE metric_ts (
  k_timestamp TIMESTAMP NOT NULL,
  data1 FLOAT8,
  data2 FLOAT8
) TAGS (device_id CHAR(40) NOT NULL, alias CHAR(40)) PRIMARY TAGS(device_id);

INSERT INTO metric_ts VALUES('2025-12-19 10:00:02.150', 1, 11, 'device1', 'beijing');
INSERT INTO metric_ts VALUES('2025-12-19 10:00:02.500', 2, 22, 'device1', 'beijing');
  • 使用精确填充(EXACT)查询

    以下示例查询时间点 10:00:02.200 处的数据,该时间点无数据,精确填充返回 NULL。

    SELECT k_timestamp, data1, data2 FROM ts_db.metric_ts
      WHERE device_id = 'device1' AND k_timestamp = '2025-12-19 10:00:02.200'
      FILL(EXACT);
              k_timestamp          | data1 | data2
    ----------------------------+-------+-------
     2025-12-19 10:00:02.2+00:00 | NULL  | NULL
    (1 row)
    
  • 使用前值填充(PREVIOUS)查询

    以下示例查询时间点 10:00:02.200 处的数据,该时间点无数据,前值填充返回之前最近的有效值。

    SELECT k_timestamp, data1, data2 FROM ts_db.metric_ts
      WHERE device_id = 'device1' AND k_timestamp = '2025-12-19 10:00:02.200'
      FILL(PREVIOUS);
              k_timestamp            | data1 | data2
    -------------------------------+-------+-------
     2025-12-19 10:00:02.2+00:00   |     1 |    11
    (1 row)
    

    以下示例设置 before_range 为 20 ms,在 [10:00:02.180, 10:00:02.200] 区间内查找,该区间内无有效值,返回 NULL。

    SELECT k_timestamp, data1, data2 FROM ts_db.metric_ts
      WHERE device_id = 'device1' AND k_timestamp = '2025-12-19 10:00:02.200'
      FILL(PREVIOUS, 20);
              k_timestamp            | data1 | data2
    -------------------------------+-------+-------
     2025-12-19 10:00:02.2+00:00   | NULL  | NULL
    (1 row)
    
  • 使用后值填充(NEXT)查询

    以下示例查询时间点 10:00:02.200 处的数据,该时间点无数据,后值填充返回之后最近的有效值。

    SELECT k_timestamp, data1, data2 FROM ts_db.metric_ts
      WHERE device_id = 'device1' AND k_timestamp = '2025-12-19 10:00:02.200'
      FILL(NEXT);
              k_timestamp            | data1 | data2
    -------------------------------+-------+-------
     2025-12-19 10:00:02.2+00:00   |     2 |    22
    (1 row)
    
  • 使用最近值填充(CLOSER)查询

    以下示例查询时间点 10:00:02.400 处的数据,该时间点无数据,最近值填充返回前后时间点中距查询时间最近的有效值。

    SELECT k_timestamp, data1, data2 FROM ts_db.metric_ts
      WHERE device_id = 'device1' AND k_timestamp = '2025-12-19 10:00:02.400'
      FILL(CLOSER);
              k_timestamp            | data1 | data2
    -------------------------------+-------+-------
     2025-12-19 10:00:02.4+00:00   |     2 |    22
    (1 row)
    
  • 使用常量填充(CONSTANT)查询

    以下示例查询时间点 10:00:02.200 处的数据,该时间点无数据,常量填充用指定常量 123 替换所有类型兼容的数据列。

    SELECT k_timestamp, data1, data2 FROM ts_db.metric_ts
      WHERE device_id = 'device1' AND k_timestamp = '2025-12-19 10:00:02.200'
      FILL(CONSTANT, 123);
              k_timestamp            | data1 | data2
    -------------------------------+-------+-------
     2025-12-19 10:00:02.2+00:00   |   123 |   123
    (1 row)
    
  • 使用线性插值填充(LINEAR)查询

    以下示例查询时间点 10:00:02.500 处的数据,该时间点无数据,线性插值填充根据前后有效值计算补值。

    -- 写入第三条数据用于线性插值
    INSERT INTO metric_ts VALUES('2025-12-19 10:00:02.600', 3, 33, 'device1', 'beijing');
    
    SELECT k_timestamp, data1, data2 FROM ts_db.metric_ts
      WHERE device_id = 'device1' AND k_timestamp = '2025-12-19 10:00:02.500'
      FILL(LINEAR);
              k_timestamp         | data1 | data2
    ------------------------------+-------+--------
      2025-12-19 10:00:02.5+00:00 |     2 |    22
    (1 row)
    

    以下示例设置 before_range 为 150 ms、after_range 为 200 ms,限定查找区间后计算线性插值。

    SELECT k_timestamp, data1, data2 FROM ts_db.metric_ts
      WHERE device_id = 'device1' AND k_timestamp = '2025-12-19 10:00:02.250'
      FILL(LINEAR, 150, 200);
              k_timestamp          | data1 | data2
    -------------------------------+-------+--------
      2025-12-19 10:00:02.25+00:00 | NULL  | NULL
    (1 row)
    

最值上下文查询

KaiwuDB 的最值上下文查询功能允许用户在使用 minmax 聚合函数查询最小值或最大值的同时,获取该最值所在行的其他列数据。该功能突破了标准 SQL 的语法限制,使用户能够在一次查询中获得最值数据的完整上下文信息。

使用说明:

  • 当前该功能仅支持在单个时序表上进行查询。
  • 每次查询中只能使用 一个 minmax 函数。
  • 仅支持以下聚合函数:minmaxfirstlast,其中
    • minmax 不支持对标签列进行聚合。
    • firstlast 仅支持对时间戳列进行聚合。
  • SELECT 子句中必须包含至少一个非聚合列,且这些非聚合列不能完全被 GROUP BY 子句包含。

前提条件

用户是 admin 角色的成员或者拥有目标表的 SELECT 权限。默认情况下,root 用户属于 admin 角色。

语法格式

SELECT <non_agg_column_list>, [<min_function> | <max_function>] [, <first_function>] [, <last_function>]
FROM <table_name>
[WHERE <condition>]
[GROUP BY <grouping_columns>]
[ORDER BY <ordering_columns>];

说明

SELECT 子句中各列顺序可以自由排列,但必须包含:

  • 至少一个非聚合列
  • 一个 min_functionmax_function

参数说明

参数说明
non_agg_column_list(必选)非聚合列列表,支持多列,每列可以是普通列名、函数表达式,或列名与函数的组合。例如:voltageround(voltage) 等,支持所有时序数据类型,支持数学函数、字符串函数与表达式计算。
min_function最小值聚合函数,支持嵌套函数,例如 min(voltage)min(abs(voltage))
max_function最大值聚合函数,支持嵌套函数,例如 max(temperature)max(sqrt(power))
first_function获取条件范围内时间戳最小的数据(不包含空值 NULL)。
last_function获取条件范围内时间戳最大的数据(不包含空值 NULL)。
table_name要查询的时序表名称。
grouping_columns用于分组的列名,可以是普通列、表达式,时间桶函数,分组窗口函数,如时间窗口、事件窗口、计数窗口、会话窗口等。
ordering_columns用于排序的列名,支持多个字段,使用逗号(,)分隔。可添加 ASC(升序)或 DESC(降序),默认为升序。

语法示例

以下示例假设用户已创建时序库 sensor_db, 时序表 sensors, 并向表内写入对应的数值。

-- 创建时序数据库
CREATE TS DATABASE sensor_db;

-- 切换到时序数据库
USE sensor_db;

-- 创建传感器数据表
CREATE TABLE sensors (
    k_timestamp TIMESTAMP NOT NULL,
    voltage FLOAT,
    temperature FLOAT
) TAGS (
    device_id INT NOT NULL,
    location VARCHAR(100)
) PRIMARY TAGS (device_id);

-- 设备1的数据 (2024-01-01)
INSERT INTO sensors (k_timestamp, voltage, temperature, device_id, location) VALUES
('2024-01-01 00:00:00', 220.5, 25.3, 1, '北京机房A'),
('2024-01-01 00:10:00', 219.8, 25.5, 1, '北京机房A'),
('2024-01-01 00:20:00', 221.2, 25.8, 1, '北京机房A'),
('2024-01-01 00:30:00', 218.5, 26.1, 1, '北京机房A'),  -- 最小电压
('2024-01-01 00:40:00', 220.0, 26.3, 1, '北京机房A'),
('2024-01-01 00:50:00', 222.3, 26.5, 1, '北京机房A'),  -- 最大电压
('2024-01-01 01:00:00', 220.8, 26.2, 1, '北京机房A'),

-- 设备2的数据 (2024-01-01)
('2024-01-01 00:00:00', 219.2, 24.8, 2, '上海机房B'),
('2024-01-01 00:10:00', 217.5, 24.9, 2, '上海机房B'),  -- 最小电压
('2024-01-01 00:20:00', 220.8, 25.2, 2, '上海机房B'),
('2024-01-01 00:30:00', 221.5, 25.5, 2, '上海机房B'),
('2024-01-01 00:40:00', 223.0, 25.8, 2, '上海机房B'),  -- 最大电压
('2024-01-01 00:50:00', 220.3, 25.6, 2, '上海机房B'),
('2024-01-01 01:00:00', 219.8, 25.3, 2, '上海机房B'),

-- 设备3的数据 (2024-01-01)
('2024-01-01 00:00:00', 221.0, 26.0, 3, '广州机房C'),
('2024-01-01 00:10:00', 220.5, 26.2, 3, '广州机房C'),
('2024-01-01 00:20:00', 219.0, 26.5, 3, '广州机房C'),  -- 最小电压
('2024-01-01 00:30:00', 221.8, 26.8, 3, '广州机房C'),
('2024-01-01 00:40:00', 224.2, 27.0, 3, '广州机房C'),  -- 最大电压
('2024-01-01 00:50:00', 222.5, 26.7, 3, '广州机房C'),
('2024-01-01 01:00:00', 221.3, 26.4, 3, '广州机房C'),

-- 跨天数据 (2024-01-02,用于条件查询测试)
('2024-01-02 00:00:00', 220.0, 25.0, 1, '北京机房A'),
('2024-01-02 00:10:00', 219.5, 25.2, 1, '北京机房A'),
('2024-01-02 00:00:00', 218.0, 24.5, 2, '上海机房B'),
('2024-01-02 00:10:00', 218.5, 24.7, 2, '上海机房B');
  • 全表查询

    以下示例查询整张表中电压的最小值及对应的时间戳、温度和设备 ID。

    SELECT k_timestamp, temperature, device_id, min(voltage) FROM sensors;
            k_timestamp        | temperature | device_id |  min
    ----------------------------+-------------+-----------+--------
      2024-01-01 00:10:00+00:00 |        24.9 |         2 | 217.5
    (1 row) 
    
  • 条件查询

    以下示例查询 2024 年 1 月 1 日的数据中,电压的最小值及对应信息。

    SELECT k_timestamp, temperature, device_id, min(voltage) 
    FROM sensors 
    WHERE k_timestamp >= '2024-01-01' AND k_timestamp < '2024-01-02';
              k_timestamp        | temperature | device_id |  min
    ----------------------------+-------------+-----------+--------
      2024-01-01 00:10:00+00:00 |        24.9 |         2 | 217.5
    (1 row)
    
  • 分组查询

    以下示例按设备分组,查询每个设备的最小电压及对应信息。

    SELECT device_id, k_timestamp, temperature, min(voltage) 
    FROM sensors 
    GROUP BY device_id
    ORDER BY device_id;
      device_id |        k_timestamp        | temperature |  min
    ------------+---------------------------+-------------+--------
              1 | 2024-01-01 00:30:00+00:00 |        26.1 | 218.5
              2 | 2024-01-01 00:10:00+00:00 |        24.9 | 217.5
              3 | 2024-01-01 00:20:00+00:00 |        26.5 |   219
    (3 rows)  
    
  • 时间窗口分组查询

    以下示例按 10 分钟为单位进行时间窗口分组,查询每个时间窗口的电压最小值及其对应的上下文数据。

    SELECT first(k_timestamp) as window_start,
         last(k_timestamp) as window_end,
         k_timestamp,
         voltage,
         device_id,
         min(voltage)
    FROM sensors 
    GROUP BY time_window(k_timestamp, '10min')
    ORDER BY window_start DESC;
            window_start        |        window_end         |        k_timestamp        | voltage | device_id |  min
    ----------------------------+---------------------------+---------------------------+---------+-----------+--------
      2024-01-02 00:10:00+00:00 | 2024-01-02 00:20:00+00:00 | 2024-01-02 00:10:00+00:00 |   218.5 |         2 | 218.5
      2024-01-02 00:00:00+00:00 | 2024-01-02 00:10:00+00:00 | 2024-01-02 00:00:00+00:00 |     218 |         2 |   218
      2024-01-01 01:00:00+00:00 | 2024-01-01 01:10:00+00:00 | 2024-01-01 01:00:00+00:00 |   219.8 |         2 | 219.8
      2024-01-01 00:50:00+00:00 | 2024-01-01 01:00:00+00:00 | 2024-01-01 00:50:00+00:00 |   220.3 |         2 | 220.3
      2024-01-01 00:40:00+00:00 | 2024-01-01 00:50:00+00:00 | 2024-01-01 00:40:00+00:00 |     220 |         1 |   220
      2024-01-01 00:30:00+00:00 | 2024-01-01 00:40:00+00:00 | 2024-01-01 00:30:00+00:00 |   218.5 |         1 | 218.5
      2024-01-01 00:20:00+00:00 | 2024-01-01 00:30:00+00:00 | 2024-01-01 00:20:00+00:00 |     219 |         3 |   219
      2024-01-01 00:10:00+00:00 | 2024-01-01 00:20:00+00:00 | 2024-01-01 00:10:00+00:00 |   217.5 |         2 | 217.5
      2024-01-01 00:00:00+00:00 | 2024-01-01 00:10:00+00:00 | 2024-01-01 00:00:00+00:00 |   219.2 |         2 | 219.2
    (9 rows)