TSCreateExpressionVirtualTab 过程根据对包含 TimeSeries 列的表所执行表达式的结果创建虚拟表。生成的虚拟表是只读的。
TSCreateExpressionVirtualTab (VirtualTableName lvarchar, BaseTableName lvarchar, expression lvarchar, subtype lvarchar, TSVTMode integer default 0, TSColName lvarchar default NULL);
使用 TSCreateExpressionVirtualTab 过程可在每次执行查询(如 SELECT 语句)时,根据对时间系列数据执行的表达式所生成的时间系列创建虚拟表。可以使用 subtype 参数在虚拟表中指定 TimeSeries 子类型的名称。
虚拟表中行的总长度(非时间系列与 TimeSeries 列的和)不得超过 32 KB。
如果指定任何可选参数,必须按照在语法中显示的顺序来指定,但您可以使用其中任何一个,而不使用其他参数。例如,可以指定 TSColName 参数而不包括 TSVTMode 参数。
虚拟表是只读的。无法对基于表达式的虚拟表运行 INSERT、UPDATE 或 DELETE 语句。根据从生成的 TimeSeries 子类型派生的虚拟表中的列,在查询虚拟表时,SELECT 语句中的 WHERE 子句不能有任何谓词。
在表达式中,可以使用时间系列 SQL 例程和其他 SQL 语句来处理数据,例如 AggregateBy 函数和 Apply 函数。
可以在表达式中使用以下变量:
以下示例使用的表 smartmeters 中包含名为 meter_id 的列和名为 readings 的 TimeSeries 列。TimeSeries 子类型具有列 t 和 energy。
以下语句创建名为 smartmeters_vti_agg_max_min 的虚拟表,该表基于包含每天的最大和最小能量读数的时间系列:
EXECUTE PROCEDURE TSCreateExpressionVirtualTab( 'smartmeters_vti_agg_max_min', 'smartmeters', 'AggregateBy("max($energy),min($energy)", "smartmeter_daily", readings, 0)', 'tworeal_row');
以下查询显示 2011-0-01 和 2011-01-02 之间每天的能量读数最大值和最小值:
SELECT * FROM smartmeters_vti_agg_max_min WHERE t >= '2011-01-01 00:00:00.00000'::datetime year to fraction(5) AND t <= '2011-01-02 23:59:59.99999'::datetime year to fraction(5); meter_id t value1 value2 met00000 2011-01-01 00:00:00.00000 37.00000000000 9.000000000000 met00000 2011-01-02 00:00:00.00000 34.00000000000 8.000000000000 met00001 2011-01-01 00:00:00.00000 36.00000000000 9.000000000000 met00001 2011-01-02 00:00:00.00000 36.00000000000 10.00000000000 met00002 2011-01-01 00:00:00.00000 34.00000000000 9.000000000000 met00002 2011-01-02 00:00:00.00000 36.00000000000 10.00000000000 6 row(s) retrieved.
以下语句创建名为 smartmeters_vti_daily_max 的虚拟表,其中包含每天的最大能量读数运行平均值:
EXECUTE PROCEDURE TSCreateExpressionVirtualTab( 'smartmeters_vti_daily_max', 'smartmeters', 'AggregateBy("max($value)","smartmeter_daily", Apply("TSRunningAvg($energy, 4)", $ts_begin_time, $ts_end_time, $ts_col_name) ::TimeSeries(onereal_row), 0)', 'onereal_row', 0, 'readings');
$ts_col_name 参数将替换为 TSCreateExpressionVirtualTab 过程指定的列名,在本例中为 readings。在查询虚拟表时会替换 $ts_begin_time 和 $ts_end_time 参数。
以下查询显示两天中每天的最大平均能量读数:
SELECT * FROM smartmeters_vti_daily_max WHERE t >= '2011-01-01 00:00:00.00000'::datetime year to fraction(5) AND t <= '2011-01-02 23:59:59.99999'::datetime year to fraction(5); meter_id t value met00000 2011-01-01 00:00:00.00000 30.25000000000 met00000 2011-01-02 00:00:00.00000 29.50000000000 met00001 2011-01-01 00:00:00.00000 29.75000000000 met00001 2011-01-02 00:00:00.00000 31.00000000000 met00002 2011-01-01 00:00:00.00000 31.25000000000 met00002 2011-01-02 00:00:00.00000 28.75000000000 6 row(s) retrieved.