光洋山
作者光洋山·2016-12-09 18:19
数据库架构师·金融科技公司

GBase 8t 时间序列TimeSeries 示例SQL说明

字数 4419阅读 2035评论 1赞 0

本文简单的通过一个简单示例过程来说明GBase 8t 时间序列TimeSeries功能的使用。

本示例是模拟环境监控PM2.5业务场景,模拟15分钟时间间隔,10个监控设备采集空气相关指标:气温、湿度、风速、PM2.5值。

第1步.创建一个自定义时间序列数据类型

ts_time保存时间点,value1,vlaue2,value3,value4分别为:气温、湿度、风速、PM2.5值

CREATE ROW TYPE row_type(ts_time datetime year to fraction(5),value1 float,value2 float,value3 float,value4 float);

第2步.创建一个容器

创建容器cn1用来存储时间序列的数据

execute procedure TsContainerCreate ('cn1','datadbs','row_type',10240,10240);

第3步.创建一个保护时间序列数据类型的table

用来存储基本数据+时间序列数据。并创建一个索引,注意这里一定要定义一个primary key。

drop table if exists meter_table;
CREATE TABLE meter_table( 
  device_id integer,
    name varchar(20),
    addr varchar(255), 
    type char(1),
    meter_data timeseries(row_type),
primary key(device_id)
);
create index idx_name on meter_table(name);

第4步.如有需要,创建一个虚拟表

如果需要提供一个标准的table的访问格式,需要将时间序列表转换为标准表,创建一个虚表,类似view,不存储数据。

drop table if exists v_meter_table;
execute procedure tscreatevirtualtab ( 'v_meter_table', 'meter_table' );

第5步.Insert 10条设备数据

即插入10个采集PM2.5的设备数据。

insert into meter_table values (1, '海淀设备','北京市海淀区中关村112号','A','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');
insert into meter_table values (2, '朝阳设备','北京市朝阳区太阳宫大厦','A','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');
insert into meter_table values (3, '丰台设备','北京市丰台区洋桥','B','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');
insert into meter_table values (4, '西城设备','北京市西城区木樨地100号','A','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');
insert into meter_table values (5, '怀柔设备','北京市怀柔雁西湖','A','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');
insert into meter_table values (6, '顺义设备','北京市顺义区北京国际机场3号航站楼','B','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');
insert into meter_table values (7, '昌平设备','北京市昌平区回龙观12号','A','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');
insert into meter_table values (8, '延庆设备','北京市延庆区八达岭','A','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');
insert into meter_table values (9, '房山设备','北京市房山区大学城','B','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');
insert into meter_table values (10, '通州设备','北京市通州区潞城','B','calendar(ts_15min),origin(2016-10-01 00:00:00.00000), threshold(0),container(cn1), regular');

第6步.模拟采集实时数据

调用TSL_* function来 批量Insert数据记录。
可以在程序中嵌入如下SQL执行(可以在dbaccess直接执行),也可以通过java程序调用
注意事项:数据结束和开始不能有任何空格出现。

EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('t');
EXECUTE FUNCTION TSL_init('meter_table','meter_data');
EXECUTE FUNCTION TSL_Put('meter_table|meter_data',
"1|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
1|2016-10-01 01:02:00.00000|24.9|75.1|2.5|143|
1|2016-10-01 01:03:00.00000|25.6|65.1|2.5|143|
2|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
2|2016-10-01 01:02:00.00000|24.9|85.1|2.5|143|
2|2016-10-01 01:03:00.00000|25.6|95.1|2.5|143|
3|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
3|2016-10-01 01:02:00.00000|24.9|65.1|2.5|143|
3|2016-10-01 01:03:00.00000|25.6|55.1|2.5|143|
4|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
4|2016-10-01 01:02:00.00000|24.9|75.1|2.5|143|
4|2016-10-01 01:03:00.00000|25.6|65.1|2.5|143|
5|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
5|2016-10-01 01:02:00.00000|24.9|85.1|2.5|143|
5|2016-10-01 01:03:00.00000|25.6|95.1|2.5|143|
6|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
6|2016-10-01 01:02:00.00000|24.9|65.1|2.5|143|
6|2016-10-01 01:03:00.00000|25.6|55.1|2.5|143|
7|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
7|2016-10-01 01:02:00.00000|24.9|75.1|2.5|143|
7|2016-10-01 01:03:00.00000|25.6|65.1|2.5|143|
8|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
8|2016-10-01 01:02:00.00000|24.9|85.1|2.5|143|
8|2016-10-01 01:03:00.00000|25.6|95.1|2.5|143|
9|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
9|2016-10-01 01:02:00.00000|24.9|65.1|2.5|143|
9|2016-10-01 01:03:00.00000|25.6|55.1|2.5|143|
10|2016-10-01 01:01:00.00000|25.1|75.1|2.5|143|
10|2016-10-01 01:02:00.00000|24.9|75.1|2.5|143|
10|2016-10-01 01:03:00.00000|25.6|65.1|2.5|143|
");
Begin work;
EXECUTE FUNCTION TSL_Flush('meter_table|meter_data');
commit;

第7步.数据查询访问

可以通过SQL语句访问数据,可以通过虚表访问。
select * from meter_table where device_id=2;

select * from v_meter_table where device_id=2;

更多的关于TimeSeries的操作及访问函数,请阅读<TimeSeire用户手册>

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论1 条评论

GBase_DavidGBase_DavidDBAGBase
2016-12-14 18:31
日历应该选择ts_1min才好
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广