创建虚拟表的示例

本示例显示如何基于包含时间系列数据的表创建虚拟表,并显示在查询基本表和虚拟表之间所存在的差异。

为了表述得更为清楚,这些示例使用值 t1t6 指示 DATETIME 值,而不显示完整的 DATETIME 字符串。

查询基本表

基本表 daily_stocks 是使用以下语句创建的:
create row type stock_bar(
   timestamp      datetime year to fraction(5),
   high      real,
   low      real,
   final      real,
   vol      real
);

create table daily_stocks (
   stock_id         int,
   stock_name         lvarchar,
   stock_data         TimeSeries(stock_bar)
);
daily_stocks 基本表包含以下数据。
表 1. daily_stocks 基本表
stock_id stock_name stock_data
900 AA01 (t1, 7.25, 6.75, 7, 1000000), (t2, 7.5, 6.875, 7.125, 1500000), ...
901 GBase 8s (t1, 97, 94.25, 95, 2000000), (t2, 97, 95.5, 96, 3000000), ...
905 FNM (t1, 49.25, 47.75, 48, 2500000), (t2, 48.75, 48, 48.25, 3000000), ...
要查询 stock_data 列,必须使用时间系列函数。例如,以下查询使用 Apply 函数来获取收盘价:
select stock_id,  
Apply('$final', stock_data)::TimeSeries(one_real) 
from daily_stocks;
在此查询中,one_real 是为保存查询结果而创建的行类型,并且是使用以下语句创建的:
create row type one_real(
   timestamp datetime year to fraction(5), 
   result real);
要获取特定时间范围内的价格和成交量信息,请使用以下格式的查询:
select stock_id, Clip(stock_data, t1, t2) from daily_stocks;

创建虚拟表

以下语句使用 TSCreateVirtualTab 过程来基于 daily_stocks 创建名为 daily_stocks_no_ts 的虚拟表:
execute procedure  
TSCreateVirtualTab('daily_stocks_no_ts', 'daily_stocks');

因为该语句不指定 NewTimeSeries 参数,所以 daily_stocks_no_ts 不允许插入在 daily_stocks 中没有对应时间系列的元素。

此外,该语句还省略了 TSVTMode 参数,因此 TSVTMode 采用其缺省值 0。所以,如果将数据插入到 daily_stocks_no_ts,那么数据库服务器将使用 PutElemNoDups 将元素添加到 daily_stocks 中的底层时间系列。

下表说明了虚拟表 daily_stocks_no_ts
表 2. daily_stocks_no_ts 虚拟表
stock_id stock_name timestamp* high low final vol
900 AA01 t1 7.25 6.75 7 1000000
900 AA01 t2 7.5 6.875 7.125 1500000
... ... ...     ... ...
901 GBase t1 97 94.25 95 2000000
901 GBase t2 97 95.5 96 3000000
... ... ...     ... ...
905 FNM t1 49.25 47.75 48 2500000
905 FNM t2 48.75 48 48.25 3000000
... ... ...     ...  
* 在此列中,t1t2 是 DATETIME 值。

查询虚拟表

对虚拟表编写某些 SQL 查询要比对基本表编写容易。例如,用于获取收盘价的查询要简单得多:
select stock_id, final from daily_stocks_no_ts;
用于获取特定时间范围内的价格和成交量的查询为:
select * from daily_stocks_no_ts 
where timestamp between t1 and t5;
某些任务使用时间系列函数来完成会比较复杂(如使用 ORDER BY 子句),但现在变得简单易行:
select * from daily_stocks_no_ts
where timestamp between t1 and t5 
order by volume;
将数据插入虚拟表也变得简单易行。要将元素添加到 GBase 股票,请使用以下查询:
insert into daily_stock_no_ts 
values('GBase', t6, 55, 53, 54, 2000000);

元素 (t6, 55, 53, 54, 2000000) 将添加到 daily_stocks