原文链接:【KWDB 创作者计划】KWDB时序数据查询 - OSCHINA - 中文开源技术交流社区
作者:狼哥Army
在数据驱动的时代,海量时序数据如潮水般涌现,高效地查询和分析这些数据成为众多领域的关键诉求。从工业设备的实时监测到金融市场的瞬息万变,从智能交通的流量调控到气象环境的长期预测,准确把握时序数据背后的规律与趋势,对优化决策、提升效率、保障安全至关重要。
KWDB 作为一款先进的时序数据库,为处理复杂的时序数据查询提供了强大的工具集。在这篇文档中,我们将深入探讨 KWDB 的时序数据查询功能,涵盖创建查询、插值查询等核心内容。无论是简单的数据检索,还是复杂的时间序列分析,KWDB 都能凭借其丰富的语法和灵活的参数设置,满足多样化的业务需求。通过详细的语法讲解、丰富的示例演示,带你深入理解并熟练运用 KWDB 的查询能力,挖掘时序数据的无限价值,开启高效数据洞察之旅 。
我相信大家对与基础的数据库 select 语句是非常熟悉的,那么对于时序数据库可能有一些不了解,那么本篇文章就是为了更好的标准时序数据库查询。
时序数据查询的基础逻辑围绕数据的时间特性展开,通过对带有时间戳的数据进行筛选、聚合、处理,从而获取有价值的信息,具体如下:
基于时间戳筛选数据:时序数据的核心标识是时间戳,最基本的查询逻辑就是依据时间戳进行数据筛选。用户可指定特定时间范围,比如查询某一天、某一小时内的数据。在 KWDB 中,通过 WHERE
子句结合时间戳列进行条件筛选,如 select * FROM ts_db.t1 WHERE ts BETWEEN '2024-02-26 01:00:00' AND '2024-02-26 02:00:00';,精准定位所需数据,这在监控系统查看特定时段设备运行数据时极为常用。
数据聚合与统计:为从大量时序数据中提取关键信息,常需进行聚合操作。像计算一段时间内数据的总和、平均值、最大值、最小值等。以 KWDB 为例,使用聚合函数 SUM、AVG、MAX、MIN 等配合 GROUP BY 子句,按时间间隔对数据分组后统计,如 select time_bucket (ts, '1h') AS time_slot, AVG (a) FROM ts_db.t1 GROUP BY time_slot;,能分析每小时数据的平均水平,在分析服务器每小时负载变化趋势时发挥重要作用。
处理数据缺失与异常:实际的时序数据常存在缺失值或异常值,影响分析准确性。为此,KWDB 提供专门的函数处理。如 time_bucket_gapfill () 函数,能插入缺失的时间戳行,结合 interpolate () 函数,依据不同补值模式(常量值、前值、后值、线性值等)对缺失数据补值。在电力监测系统中,可利用这些函数修复因故障导致的电力数据缺失,确保数据的完整性和连续性,为后续分析提供可靠数据。
我们当前的数据库仅有一条数据,肯定不够测试的,可以运行后面我给出的 SQL 语句来增加一些数据,用来测试我们的查询效果。
这是函数语句:
-- 生成随机年龄(18 - 60岁之间)CREATE OR replace FUNCTION random_age() RETURNS INT AS $$BEGIN RETURN floor(random() * (60 - 18 + 1) + 18)::INT;END; $$ LANGUAGE plpgsql;-- 生成随机身高(150.0 - 200.0之间)CREATE OR replace FUNCTION random_height() RETURNS FLOAT AS $$BEGIN RETURN (random() * (200.0 - 150.0) + 150.0)::FLOAT;END; $$ LANGUAGE plpgsql;-- 生成随机体重(50.0 - 100.0之间)CREATE OR replace FUNCTION random_weight() RETURNS FLOAT AS $$BEGIN RETURN (random() * (100.0 - 50.0) + 50.0)::FLOAT;END; $$ LANGUAGE plpgsql;-- 生成随机用户角色(假设几种常见角色)CREATE OR replace FUNCTION random_user_role() RETURNS VARCHAR(30) AS $$declare roles VARCHAR(30)[] := ARRAY['admin', 'user', 'editor', 'viewer'];BEGIN RETURN roles[ceil(random() * array_length(roles, 1))::INT];END; $$ LANGUAGE plpgsql;-- 批量插入50条数据DO $$declare i INT := 1; start_time TIMESTAMP := current_timestamp;BEGIN WHILE i <= 50 LOOP insert INTO users ( k_timestamp, user_age, user_height, user_weight, user_id, user_role ) VALUES ( start_time + INTERVAL '1 minute' * (i - 1), random_age(), random_height(), random_weight(), i, random_user_role() ); i := i + 1; END LOOP;END $$;
我们发现不支持函数。
那么,我们就只能通过 insert 语句来插入了。
-- 插入第1条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:34:54.779+00:00', 25, 170.5, 65.0, 1, 'user'); -- 插入第2条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:34:57.779+00:00', 30, 165.0, 70.0, 2, '张三'); -- 插入第3条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:00.779+00:00', 22, 175.0, 75.0, 3, '李四'); -- 插入第4条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:03.779+00:00', 28, 180.0, 80.0, 4, '王五');- - 插入第5条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:06.779+00:00', 32, 160.0, 60.0, 5, '赵六'); -- 插入第6条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:09.779+00:00', 24, 172.0, 68.0, 6, '孙七'); -- 插入第7条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:12.779+00:00', 27, 168.0, 72.0, 7, '周八'); -- 插入第8条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:15.779+00:00', 35, 185.0, 90.0, 8, '吴九'); -- 插入第9条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:18.779+00:00', 21, 158.0, 55.0, 9, '郑十'); -- 插入第10条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:21.779+00:00', 29, 178.0, 85.0, 10, '陈十一'); -- 插入第11条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:24.779+00:00', 23, 163.0, 62.0, 11, '杨十二'); -- 插入第12条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:27.779+00:00', 31, 176.0, 78.0, 12, '刘十三'); -- 插入第13条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:30.779+00:00', 26, 166.0, 74.0, 13, '张十四'); -- 插入第14条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:33.779+00:00', 20, 155.0, 50.0, 14, '李十五');- - 插入第15条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:36.779+00:00', 33, 182.0, 88.0, 15, '王十六'); -- 插入第16条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:39.779+00:00', 27, 171.0, 66.0, 16, '赵十七'); -- 插入第17条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:42.779+00:00', 30, 169.0, 73.0, 17, '孙十八'); -- 插入第18条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:45.779+00:00', 24, 174.0, 76.0, 18, '周十九'); -- 插入第19条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:48.779+00:00', 28, 164.0, 64.0, 19, '吴二十'); -- 插入第20条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:51.779+00:00', 34, 183.0, 92.0, 20, '郑二十一'); -- 插入第21条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:54.779+00:00', 22, 159.0, 58.0, 21, '陈二十二'); -- 插入第22条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:35:57.779+00:00', 29, 177.0, 86.0, 22, '杨二十三'); -- 插入第23条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:36:00.779+00:00', 23, 162.0, 60.0, 23, '刘二十四'); -- 插入第24条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:36:03.779+00:00', 31, 173.0, 77.0, 24, '张二十五'); -- 插入第25条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:36:06.779+00:00', 26, 167.0, 71.0, 25, '李二十六'); -- 插入第26条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:36:09.779+00:00', 20, 156.0, 52.0, 26, '王二十七');- - 插入第27条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:36:12.779+00:00', 33, 181.0, 87.0, 27, '赵二十八'); -- 插入第28条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:36:15.779+00:00', 27, 170.0, 67.0, 28, '孙二十九'); -- 插入第29条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:36:18.779+00:00', 30, 168.0, 75.0, 29, '周三十'); -- 插入第30条数据insert INTO users (k_timestamp, user_age, user_height, user_weight, user_id, user_role)VALUES ('2025-04-16 10:36:21.779+00:00', 24, 173.0, 78.0, 30, '吴三十一');
我们插入了 30 条数据:
1、根据时间范围查询数据
查询 k_timestamp 在 '2025-04-16 10:35:00.779+00:00' 到 '2025-04-16 10:36:00.779+00:00' 之间的记录
select * FROM users WHERE k_timestamp BETWEEN '2025-04-16 10:35:00.779+00:00' AND '2025-04-16 10:36:00.779+00:00';
2、使用时间函数提取时间的小时部分并分组统计
提取 k_timestamp 的小时部分,按 10 秒分组统计每个小时内的记录数量。
select EXTRACT(HOUR FROM k_timestamp) AS hour_part, COUNT(*) AS record_count FROM users GROUP BY EXTRACT(HOUR FROM k_timestamp);
3、按时间间隔查询数据
按每 10 秒一组统计记录数量,这里根据 KWDB 的时间函数来获取时间分组的标识,假设使用 time_bucket 函数。
select date_trunc('second', k_timestamp - (EXTRACT(EPOCH FROM k_timestamp) % 10) * INTERVAL '1 second') AS time_group, COUNT(*) AS record_count FROM users GROUP BY date_trunc('second', k_timestamp - (EXTRACT(EPOCH FROM k_timestamp) % 10) * INTERVAL '1 second');
SQL 语句解释说明:
为了兼容 SQL 标准,KWDB 支持以下函数,这些函数与常规的内置函数具有等效功能。
避免在 SUBSTRING 函数中使用转义字符 +。
特殊形式 | 等价于 |
---|---|
AT TIME ZONE | timezone() |
CURRENT_CATALOG | current_database() |
COLLATION FOR | pg_collation_for() |
CURRENT_DATE | current_date() |
CURRENT_ROLE | current_user() |
CURRENT_SCHEMA | current_schema() |
CURRENT_TIMESTAMP | current_timestamp() |
CURRENT_TIME | current_time() |
CURRENT_USER | current_user() |
EXTRACT(<part> FROM <value>) | extract("<part>", <value>) |
EXTRACT_DURATION(<part>FROM <value>) | extract_duration("<part>",<value>) |
OVERLAY(<text1> PLACING <text2> FROM <int1> FOR <int2>) | overlay(<text1>,<text2>, <int1>, <int2>) |
OVERLAY(<text1> PLACING <text2> FROM <int>) | overlay(<text1>,<text2>, <int>) |
POSITION(<text1> IN <text2>) | strpos(<text2>, <text1>) |
SESSION_USER | current_user() |
SUBSTRING(<text>FOR<int1>FROM <int2>) | substring(<text>,<int2>, <int1>) |
SUBSTRING(<text> FOR <int>) | substring(<text>, 1, <int>) |
SUBSTRING(<text>FROM<int1>FOR<int2>) | substring(<text>,<int1>, <int2>) |
SUBSTRING(<text> FROM <int>) | substring(<text>, <int>) |
TRIM(<text1> FROM <text2>) | btrim(<text2>, <text1>) |
TRIM(<text1>, <text2>) | btrim(<text1>, <text2>) |
TRIM(FROM <text>) | btrim(<text>) |
TRIM(LEADING <text1> FROM <text2>) | ltrim(<text2>, <text1>) |
TRIM(LEADING FROM <text>) | ltrim(<text>) |
TRIM(TRAILING <text1> FROM <text2>) | rtrim(<text2>, <text1>) |
TRIM(TRAILING FROM <text>) | rtrim(<text>) |
USER | current_user() |
具有特殊评估规则的运算符如下:
运算符 | 描述 |
---|---|
CAST(...) | 类型转换 说明 - 时序表建表时,如果时间戳列的数据类型设置为 TIMESTAMP,系统会自动处理为 TIMESTAMPTZ,对该列的转换将按照数据库设置的时区进行转换。 - 使用 CAST 函数将 char、NCHAR 或 VARCHAR 数据类型转换为长度不同的 char、NCHAR 或 VARCHAR 数据类型时,如果目标长度不匹配原始字符串的实际字节数,服务端可能会返回乱码,客户端(如 KaiwuDB JDBC 或 KaiwuDB 开发者中心)会提示报错。 |
IFNULL(...) | COALESCE 限制为两个操作数的别名 |
NULLIF(...) | NULL 有条件地返回 |
函数 → 返回值 | 描述 |
---|---|
age(end: timestamptz, begin: timestamptz) → interval | 计算 begin 和 end 之间的时间间隔。 |
age(val: timestamptz) → interval | 计算 val 与当前时间之间的间隔。 |
current_timestamp() → timestamp | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
current_timestamp() → timestamptz | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
date_trunc(element: string, input: timestamp) → timestamp | 将输入截断成精度为 element,将所有无意义的字段设为 0(或对于日期和月份则设为 1)。兼容元素:millennium、century、decade、year、quarter、month、week、day、hour、minute、second、millisecond、microsecond。 |
date_trunc(element: string, input: timestamptz) → timestamptz | 将输入截断成精度为 element,将所有无意义的字段设为 0(或对于日期和月份则设为 1)。兼容元素:millennium、century、decade、year、quarter、month、week、day、hour、minute、second、millisecond、microsecond。 |
experimental_strftime(input: timestamp, extract_format: string) → string | 从输入中提取并格式化成 extract_format 标识的时间,extract_format 使用标准的 strftime 表示法(尽管不支持所有格式)。 |
experimental_strftime(input: timestamptz, extract_format: string) → string | 从输入中提取并格式化成 extract_format 标识的时间,extract_format 使用标准的 strftime 表示法(尽管不支持所有格式)。 |
extract(element: string, input: timestamp) → float8 | 从输入中提取 element。兼容元素:millennium、century、decade、year、isoyear、quarter、month、week、dayofweek、isodow、dayofyear、julian、hour、minute、second、millisecond、microsecond、epoch、timezone、timezone_hour、timezone_minute。 |
extract(element: string, input: timestamptz) → float8 | 从输入中提取 element。兼容元素:millennium、century、decade、year、isoyear、quarter、month、week、dayofweek、isodow、dayofyear、julian、hour、minute、second、millisecond、microsecond、epoch、timezone、timezone_hour、timezone_minute。 |
localtimestamp() → timestamp | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
localtimestamp() → timestamptz | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
localtimestamp(precision: int8) → timestamp | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
localtimestamp(precision: int8) → timestamptz | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
now() → timestamp | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
now() → timestamptz | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
statement_timestamp() → timestamp | 返回当前语句的开始时间戳。 |
statement_timestamp() → timestamptz | 返回当前语句的开始时间戳。 |
timeofday() → string | 返回某个集群节点的当前系统时间。 |
time_bucket(timestamp_column: timestamp, interval: STRING) → timestamp | 时间桶函数,支持时间戳对齐。 参数说明: - 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 |
time_bucket(timestamp_column: timestamptz, interval: STRING) → timestamptz | 时间桶函数,支持时间戳对齐。 参数说明: - 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 |
time_bucket_gapfill(timestamp_column: timestamp, interval: STRING) → timestamp | 时间桶函数,根据时间间隔对时间戳进行对齐,并填充缺失的时间戳行。该函数必须与 GROUP BY 配合使用。相关使用说明和示例。 time_bucket_gapfill() 函数也可以和 interpolate() 函数配合使用,填充缺失的时间戳行的同时对指定数据列进行补值。 参数说明: - 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 。 |
time_bucket_gapfill(timestamp_column: timestamptz, interval: STRING) → timestamptz | 时间桶函数,根据时间间隔对时间戳进行对齐,并填充缺失的时间戳行。该函数必须与 GROUP BY 配合使用。相关使用说明和示例。 time_bucket_gapfill() 函数也可以和 interpolate() 函数配合使用,填充缺失的时间戳行的同时对指定数据列进行补值。 参数说明: - 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 |
time_bucket_gapfill(timestamp_column: timestamp, interval: int8) → timestamp | 时间桶函数,根据时间间隔对时间戳进行对齐,并填充缺失的时间戳行。该函数必须与 GROUP BY 配合使用。相关使用说明和示例。time_bucket_gapfill() 函数也可以和 interpolate() 函数配合使用,填充缺失的时间戳行的同时对指定数据列进行补值。 参数说明: - 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 |
time_bucket_gapfill(timestamp_column: timestamptz, interval: int8) → timestamptz | 时间桶函数,根据时间间隔对时间戳进行对齐,并填充缺失的时间戳行。该函数必须与 GROUP BY 配合使用。相关使用说明和示例, time_bucket_gapfill() 函数也可以和 interpolate() 函数配合使用,填充缺失的时间戳行的同时对指定数据列进行补值。 参数说明: - 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 |
transaction_timestamp() → timestamp | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
transaction_timestamp() → timestamptz | 返回当前事务的时间。该值基于事务开始时选择的时间戳,并且在整个事务中保持不变。此时间戳与并发事务的提交顺序无关。 |
利用 time_bucket_gapfill () 和 interpolate () 函数保证数据完整性和连续性;关联与联合查询,通过关联字段连接多表数据或合并多个查询结果,获取全面信息和进行对比分析。
在数据准备方面,原计划创建函数批量插入 50 条数据,但因不支持函数,最终采用 insert 语句逐条插入 30 条数据用于测试。随后进行查询测试,包括根据时间范围查询、使用时间函数提取时间小时部分并分组统计、按每 10 秒间隔分组统计记录数量,同时对按 10 秒分组的 SQL 语句进行详细解释。最后,介绍了 KWDB 为兼容 SQL 标准支持的函数,给出 KWDB 与传统 SQL 形式对照表,还列举了条件和类函数运算符以及日期和时间函数的相关信息。
时序数据库有很多函数是与关系型数据库通用的,特有的函数的对照可以在【KWDB VS 传统 SQL 形式对照表】中看到,使用过程中可能会有很多的不习惯,这个放心,用多了自然就熟悉了,内容很多,需要慢慢的尝试。
KWDB 开源库地址:https://gitee.com/kwdb/kwdb
KWDB 学习地址:https://www.kaiwudb.com/learning/
KWDB 活动地址:https://mp.weixin.qq.com/s/ZKQo7eQj_AtwamONCSl07A