KaiwuDBKaiwuDB

KWDB 创作者计划 | KWDB 时序数据查询

2025-05-20

原文链接:【KWDB 创作者计划】KWDB时序数据查询 - OSCHINA - 中文开源技术交流社区

作者:狼哥Army


前言

在数据驱动的时代,海量时序数据如潮水般涌现,高效地查询和分析这些数据成为众多领域的关键诉求。从工业设备的实时监测到金融市场的瞬息万变,从智能交通的流量调控到气象环境的长期预测,准确把握时序数据背后的规律与趋势,对优化决策、提升效率、保障安全至关重要。

KWDB 作为一款先进的时序数据库,为处理复杂的时序数据查询提供了强大的工具集。在这篇文档中,我们将深入探讨 KWDB 的时序数据查询功能,涵盖创建查询、插值查询等核心内容。无论是简单的数据检索,还是复杂的时间序列分析,KWDB 都能凭借其丰富的语法和灵活的参数设置,满足多样化的业务需求。通过详细的语法讲解、丰富的示例演示,带你深入理解并熟练运用 KWDB 的查询能力,挖掘时序数据的无限价值,开启高效数据洞察之旅 。

KWDB 创作者计划 | KWDB 时序数据查询(图1)

我相信大家对与基础的数据库 select 语句是非常熟悉的,那么对于时序数据库可能有一些不了解,那么本篇文章就是为了更好的标准时序数据库查询。

时序数据库查询逻辑

时序数据查询的基础逻辑围绕数据的时间特性展开,通过对带有时间戳的数据进行筛选、聚合、处理,从而获取有价值的信息,具体如下:

KWDB 创作者计划 | KWDB 时序数据查询(图2)

  1. 基于时间戳筛选数据:时序数据的核心标识是时间戳,最基本的查询逻辑就是依据时间戳进行数据筛选。用户可指定特定时间范围,比如查询某一天、某一小时内的数据。在 KWDB 中,通过 WHERE 子句结合时间戳列进行条件筛选,如 select * FROM ts_db.t1 WHERE ts BETWEEN '2024-02-26 01:00:00' AND '2024-02-26 02:00:00';,精准定位所需数据,这在监控系统查看特定时段设备运行数据时极为常用。


  2. 数据聚合与统计:为从大量时序数据中提取关键信息,常需进行聚合操作。像计算一段时间内数据的总和、平均值、最大值、最小值等。以 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;,能分析每小时数据的平均水平,在分析服务器每小时负载变化趋势时发挥重要作用。


  3. 处理数据缺失与异常:实际的时序数据常存在缺失值或异常值,影响分析准确性。为此,KWDB 提供专门的函数处理。如 time_bucket_gapfill () 函数,能插入缺失的时间戳行,结合 interpolate () 函数,依据不同补值模式(常量值、前值、后值、线性值等)对缺失数据补值。在电力监测系统中,可利用这些函数修复因故障导致的电力数据缺失,确保数据的完整性和连续性,为后续分析提供可靠数据。


  4. 关联与联合查询:当涉及多个相关的时序数据表时,需通过关联和联合查询获取更全面的信息。关联查询可依据相同的时间戳或其他关联字段,将多个表的数据连接起来,比如设备信息表和设备运行数据表通过设备 ID 和时间戳关联,查询设备在特定时间的详细信息和运行状态。联合查询则用于合并多个查询结果,便于对比分析不同数据源的数据,帮助企业综合评估业务状况。

数据准备

我们当前的数据库仅有一条数据,肯定不够测试的,可以运行后面我给出的 SQL 语句来增加一些数据,用来测试我们的查询效果。

KWDB 创作者计划 | KWDB 时序数据查询(图3)

创建函数测试

这是函数语句:

-- 生成随机年龄(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 $$;

我们发现不支持函数。

KWDB 创作者计划 | KWDB 时序数据查询(图4)

那么,我们就只能通过 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 条数据:

KWDB 创作者计划 | KWDB 时序数据查询(图5)

查询测试

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';

KWDB 创作者计划 | KWDB 时序数据查询(图6)

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);

KWDB 创作者计划 | KWDB 时序数据查询(图7)

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');

KWDB 创作者计划 | KWDB 时序数据查询(图8)

SQL 语句解释说明:

  1. EXTRACT (EPOCH FROM k_timestamp) 获取时间戳的秒数。
  2. (EXTRACT (EPOCH FROM k_timestamp) % 10) 计算当前秒数对 10 取余,得到当前时间距离上一个 10 秒间隔的偏移秒数。
  3. k_timestamp - (EXTRACT (EPOCH FROM k_timestamp) % 10) * INTERVAL '1 second' 将时间戳减去偏移秒数,使其对齐到最近的 10 秒间隔的起始时间。
  4. date_trunc ('second',...) 对调整后的时间进行截断,只保留到秒级别,从而实现每 10 秒分组的效果。

KWDB_时序数据函数 EXTRACT 函数详解

为了兼容 SQL 标准,KWDB 支持以下函数,这些函数与常规的内置函数具有等效功能。

避免在 SUBSTRING 函数中使用转义字符 +。

KWDB VS 传统 SQL 形式对照表

特殊形式等价于
AT TIME ZONEtimezone()
CURRENT_CATALOGcurrent_database()
COLLATION FORpg_collation_for()
CURRENT_DATEcurrent_date()
CURRENT_ROLEcurrent_user()
CURRENT_SCHEMAcurrent_schema()
CURRENT_TIMESTAMPcurrent_timestamp()
CURRENT_TIMEcurrent_time()
CURRENT_USERcurrent_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_USERcurrent_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>)
USERcurrent_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。 各时间单位支持的输入格式如下所示: - 纳秒:nsnsecnsecsnanosecondnanoseconds - 微秒:us 、usecusecsmicrosecondmicroseconds - 毫秒:msmsecmsecsmillisecondmilliseconds - 秒:ssecsecssecondseconds - 分:mminminsminuteminutes - 小时:hhrhrshourhours - 天:ddaydays - 周:wweekweeks - 月:monmonsmonthmonths - 年:yyryrsyearyears
time_bucket(timestamp_column: timestamptz, interval: STRING) → timestamptz时间桶函数,支持时间戳对齐。 参数说明: - timestamp_column:时间戳列。 - interval:时间间隔,支持的单位包括纳秒、微秒、毫秒、秒、分、小时、天、周、月、年。目前,KWDB 不支持复合时间格式,如 1d1h。 各时间单位支持的输入格式如下所示: - 纳秒:nsnsecnsecsnanosecondnanoseconds - 微秒:us 、usecusecsmicrosecondmicroseconds - 毫秒:msmsecmsecsmillisecondmilliseconds - 秒:ssecsecssecondseconds - 分:mminminsminuteminutes - 小时:hhrhrshourhours - 天:ddaydays - 周:wweekweeks - 月:monmonsmonthmonths - 年:yyryrsyearyears
time_bucket_gapfill(timestamp_column: timestamp, interval: STRING) → timestamp时间桶函数,根据时间间隔对时间戳进行对齐,并填充缺失的时间戳行。该函数必须与 GROUP BY 配合使用。相关使用说明和示例。 time_bucket_gapfill() 函数也可以和 interpolate() 函数配合使用,填充缺失的时间戳行的同时对指定数据列进行补值。 参数说明: - timestamp_column:时间戳列。 - interval:时间间隔,支持的单位包括纳秒、微秒、毫秒、秒、分、小时、天、周、月、年。目前,KWDB 不支持复合时间格式,如 1d1h。 各时间单位支持的输入格式如下所示: - 纳秒:nsnsecnsecsnanosecondnanoseconds - 微秒:us 、usecusecsmicrosecondmicroseconds - 毫秒:msmsecmsecsmillisecondmilliseconds - 秒:ssecsecssecondseconds - 分:mminminsminuteminutes - 小时:hhrhrshourhours - 天:ddaydays - 周:wweekweeks - 月:monmonsmonthmonths - 年:yyryrsyearyears
time_bucket_gapfill(timestamp_column: timestamptz, interval: STRING) → timestamptz时间桶函数,根据时间间隔对时间戳进行对齐,并填充缺失的时间戳行。该函数必须与 GROUP BY 配合使用。相关使用说明和示例。 time_bucket_gapfill() 函数也可以和 interpolate() 函数配合使用,填充缺失的时间戳行的同时对指定数据列进行补值。 参数说明: - timestamp_column:时间戳列。 - interval:时间间隔,支持的单位包括纳秒、微秒、毫秒、秒、分、小时、天、周、月、年。目前,KWDB 不支持复合时间格式,如 1d1h。 各时间单位支持的输入格式如下所示: - 纳秒:nsnsecnsecsnanosecondnanoseconds - 微秒:us 、usecusecsmicrosecondmicroseconds - 毫秒:msmsecmsecsmillisecondmilliseconds - 秒:ssecsecssecondseconds - 分:mminminsminuteminutes - 小时:hhrhrshourhours - 天:ddaydays - 周:wweekweeks - 月:monmonsmonthmonths - 年:yyryrsyearyears
time_bucket_gapfill(timestamp_column: timestamp, interval: int8) → timestamp时间桶函数,根据时间间隔对时间戳进行对齐,并填充缺失的时间戳行。该函数必须与 GROUP BY 配合使用。相关使用说明和示例。time_bucket_gapfill() 函数也可以和 interpolate() 函数配合使用,填充缺失的时间戳行的同时对指定数据列进行补值。 参数说明: - timestamp_column:时间戳列。 - interval:时间间隔,支持的单位包括纳秒、微秒、毫秒、秒、分、小时、天、周、月、年。目前,KWDB 不支持复合时间格式,如 1d1h。 各时间单位支持的输入格式如下所示: - 纳秒:nsnsecnsecsnanosecondnanoseconds - 微秒:us 、usecusecsmicrosecondmicroseconds - 毫秒:msmsecmsecsmillisecondmilliseconds - 秒:ssecsecssecondseconds - 分:mminminsminuteminutes - 小时:hhrhrshourhours - 天:ddaydays - 周:wweekweeks - 月:monmonsmonthmonths - 年:yyryrsyearyears
time_bucket_gapfill(timestamp_column: timestamptz, interval: int8) → timestamptz时间桶函数,根据时间间隔对时间戳进行对齐,并填充缺失的时间戳行。该函数必须与 GROUP BY 配合使用。相关使用说明和示例, time_bucket_gapfill() 函数也可以和 interpolate() 函数配合使用,填充缺失的时间戳行的同时对指定数据列进行补值。 参数说明: - timestamp_column:时间戳列。 - interval:时间间隔,支持的单位包括纳秒、微秒、毫秒、秒、分、小时、天、周、月、年。目前,KWDB 不支持复合时间格式,如 1d1h。 各时间单位支持的输入格式如下所示: - 纳秒:nsnsecnsecsnanosecondnanoseconds - 微秒:us 、usecusecsmicrosecondmicroseconds - 毫秒:msmsecmsecsmillisecondmilliseconds - 秒:ssecsecssecondseconds - 分:mminminsminuteminutes - 小时:hhrhrshourhours - 天:ddaydays - 周:wweekweeks - 月:monmonsmonthmonths - 年:yyryrsyearyears
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


体验全新的分布式多模数据库解决方案

企业版 社区版

KaiwuDB 是浪潮控股的数据库企业,面向工业物联网、数字能源、车联网、智慧产业等行业领域,提供稳定安全、高性能、易运维的创新数据软件与服务。

关注官方微信

友情链接:浪潮  

© 上海沄熹科技有限公司 Shanghai Yunxi Technology Co., Ltd.    沪ICP备2023002175号-1    网站服务协议   |   隐私政策
400-624-5688-7
服务与支持
marketing@kaiwudb.org.cn