TSCreateExpressionVirtualTab 过程

TSCreateExpressionVirtualTab 过程根据对包含 TimeSeries 列的表所执行表达式的结果创建虚拟表。生成的虚拟表是只读的。

语法

TSCreateExpressionVirtualTab
                  (VirtualTableName  lvarchar,
                   BaseTableName     lvarchar,
                   expression        lvarchar,
                   subtype           lvarchar,
                   TSVTMode          integer default 0,
                   TSColName         lvarchar default NULL);
VirtualTableName
新虚拟表的名称。
BaseTableName
基本表的名称。
expression
要根据时间系列数据求值的表达式。
subtype
表达式结果值的 TimeSeries 子类型的名称。
TSVTMode(可选)
设置虚拟表方式,如 TSVTMode 参数中所述。
TSColName(可选)
对于包含多个 TimeSeries 列的基本表,指定要用于创建虚拟表的 TimeSeries 列的名称。TSColName 参数的缺省值为 NULL,在这种情况下,基本表必须仅包含一个 TimeSeries 列。

用法

使用 TSCreateExpressionVirtualTab 过程可在每次执行查询(如 SELECT 语句)时,根据对时间系列数据执行的表达式所生成的时间系列创建虚拟表。可以使用 subtype 参数在虚拟表中指定 TimeSeries 子类型的名称。

虚拟表中行的总长度(非时间系列与 TimeSeries 列的和)不得超过 32 KB。

如果指定任何可选参数,必须按照在语法中显示的顺序来指定,但您可以使用其中任何一个,而不使用其他参数。例如,可以指定 TSColName 参数而不包括 TSVTMode 参数。

虚拟表是只读的。无法对基于表达式的虚拟表运行 INSERT、UPDATE 或 DELETE 语句。根据从生成的 TimeSeries 子类型派生的虚拟表中的列,在查询虚拟表时,SELECT 语句中的 WHERE 子句不能有任何谓词。

在表达式中,可以使用时间系列 SQL 例程和其他 SQL 语句来处理数据,例如 AggregateBy 函数和 Apply 函数。

可以在表达式中使用以下变量:

示例

以下示例使用的表 smartmeters 中包含名为 meter_id 的列和名为 readingsTimeSeries 列。TimeSeries 子类型具有列 tenergy

示例 1:查找每天的最大值和最小值

以下语句创建名为 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.

示例 2:查找每天的最大运行平均值

以下语句创建名为 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.