时序数据查询
时序数据库支持使用 SQL 语句执行简单查询、嵌套查询、关联查询、联合查询和插值查询。
创建查询
前提条件
用户拥有目标表的 SELECT 权限。
语法格式
有关时序数据查询的语法格式,参见 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); CREATE TABLE -- 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 BY和ORDER 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)
插值查询
时间序列数据中,有时会存在缺失和偏离的数据,影响后续数据的使用和分析。KWDB 提供了 time_bucket_gapfill() 函数和 interpolate() 函数,支持用户对指定窗口间隔的数据进行时间戳对齐,插入缺失的时间戳行,并根据需要选择是否进行补值。
说明
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;
前提条件
用户拥有目标表的 SELECT 权限。
语法格式
插入缺失的时间戳行但不补值
SELECT time_bucket_gapfill (<timestamp_column>, <interval>) AS <alias> FROM <table_name> GROUP BY <alias> [ORDER BY <alias>];插入缺失的时间戳行并进行补值
SELECT time_bucket_gapfill (<timestamp_column>, <interval>) AS <alias> interpolate (expression_1, expression_2) FROM <table_name> GROUP BY <alias> [ORDER BY <alias>];
参数说明
| 参数 | 说明 |
|---|---|
timestamp_column | 时间戳列。 |
interval | 时间间隔,支持的单位包括纳秒、微秒、毫秒、秒、分、小时、天、周、月、年。目前,KWDB 不支持复合时间格式,如 1d1h。 各时间单位支持的输入格式如下所示: - 纳秒: ns、nsec、nsecs、nanosecond、nanoseconds - 微秒: us 、usec、usecs、microsecond、microseconds - 毫秒: ms、msec、msecs、millisecond、milliseconds - 秒: s、sec、secs、second、seconds - 分: m、min、mins、minute、minutes - 小时: h、hr、hrs、hour、hours- 天: d、day、days - 周: w、week、weeks - 月: mon、mons、month、months - 年: y、yr、yrs、year、years |
alias | 为生产的时间桶结果起的别名,便于后续引用。 |
expression_1 | 补值算法,必须是聚合函数且数据类型为数字。 |
expression_2 | 补值模式,支持常量值(constant)、前值(prev)、后值(next)、线性值(linear)和 NULL。补值结果类型应与原始值一致。 |
table_name | 待查询表的名称。 |
语法示例
插入缺失的时间戳行但不补值。
以下示例对
t1表进行插值查询,但不补值。SELECT time_bucket_gapfill (timestamp, 600) AS a FROM t1 GROUP BY a ORDER BY a; time_bucket_gapfill --------------------------- 2022-11-04 19:20:00 2022-11-04 19:30:00 2022-11-04 19:40:00 2022-11-04 19:50:00 2022-11-04 20:00:00 2022-11-04 20:10:00 (6 rows)插入缺失的时间戳行并使用前值进行补值。
以下示例对
t1表进行插值查询,并使用前值进行补值。SELECT time_bucket_gapfill(timestamp, 600) AS a, interpolate(avg(e6), PREV) FROM t1 GROUP BY a ORDER BY a; time_bucket_gapfill | interpolate -----------------------+--------------- 2022-11-04 19:20:00 | 499.999 2022-11-04 19:30:00 | 499.999 2022-11-04 19:40:00 | 99.999 2022-11-04 19:50:00 | 99.999 2022-11-04 20:00:00 | 177.999 2022-11-04 20:10:00 | 20.999 (6 rows)插入缺失的时间戳行并使用常量进行补值。
以下示例对
t1表进行插值查询,并使用常量进行补值。SELECT time_bucket_gapfill(timestamp, 600) AS a, interpolate(avg(e6), '40') FROM t1 GROUP BY a ORDER BY a; time_bucket_gapfill | interpolate ---------------------+--------------- 2022-11-04 19:20:00 | 499.999 2022-11-04 19:30:00 | 40 2022-11-04 19:40:00 | 99.999 2022-11-04 19:50:00 | 40 2022-11-04 20:00:00 | 177.999 2022-11-04 20:10:00 | 20.999 (6 rows)