Transpose 函数

Transpose 函数会转换用于以表格式进行处理的时间系列数据。

语法

Transpose (ts       TimeSeries, 
       begin_stamp datetime year to fraction(5) default NULL, 
       end_stamp   datetime year to fraction(5) default NULL,
       flags       integer default 0) 
returns row;

Transpose (query    lvarchar,
        dummy        row,
        begin_stamp datetime year to fraction(5) default NULL, 
        end_stamp    datetime year to fraction(5) default NULL,
       col_name   lvarchar default NULL,
       flags       integer default 0) 
returns row with (iterator);
ts
要转换的时间系列。
begin_stamp
范围的起始点。可为 NULL
end_stamp
范围的结束点。可为 NULL
flags
确定扫描如何处理返回的集合。
query
包含可返回多个列(但其中只能有一个列包含时间系列)的 SELECT 语句的字符串。非时间系列的列将与返回行中的每个时间系列元素合并。
dummy
一种行类型,必须作为 NULL 传入并强制转型为 Transpose 函数的查询字符串版本所返回每个行的预期返回类型。
col_name
如果 col_name 不是 NULL,将仅从时间系列元素使用以此参数指定的列,以及非时间系列的列。

描述

Transpose 函数是迭代器函数。您可以使用 EXECUTE FUNCTION 语句或者在表表达式中运行 Transpose 函数。

通常,返回在时间系列中找到的行时,transpose 函数会跳过 NULL 元素。如果设置 flags 参数的 TS_SCAN_NULLS_OK (0x40) 位,那么 Transpose 函数会返回 NULL 元素。

如果开始点是 NULL,扫描在时间系列的第一个元素上开始,除非设置了 flags 参数的 TS_SCAN_EXACT_START 值。

如果结束点是 NULL,扫描在时间系列的最后一个元素结束,除非设置了 flags 参数的 TS_SCAN_EXACT_END 值。

flags 自变量值

flags 参数决定了扫描如何处理返回的集合。flags 的值是下表中所需标志值的总和。
表 1. flags 参数值
标志 含义
TS_SCAN_HIDDEN 512 返回 HideElem 标记的隐藏元素(请参阅 HideElem 函数)。
TS_SCAN_EXACT_START 256 返回开始时间点上的元素,必要时添加空元素。
TS_SCAN_EXACT_END 128 将元素返回到结束点(必要时返回 NULL)。
TS_SCAN_NULLS_OK 64 返回空时间系列元素(缺省情况下,未返回 NULL 的时间系列元素)。
TS_SCAN_NO_NULLS 32 返回已设置时间戳记并将其他列设置为 NULL 的行,而不返回空行。
TS_SCAN_SKIP_END 16 跳过扫描范围的结束时间点上的元素。
TS_SCAN_SKIP_BEGIN 8 跳过扫描范围的开始时间点上的元素。
TS_SCAN_SKIP_HIDDEN 4 ts_begin_scan() 用于告知 ts_next() 不返回隐藏的元素。

返回结果

包含时间系列元素的时间戳记和其他列的多个行。

示例 1:将时间系列数据转换为表

以下语句将数据从 GBase 的 stock_data 转换为表格式:
execute function Transpose((select stock_data 
   from daily_stocks where stock_name = 'GBase'));

示例 2:变换剪切的数据

以下语句将剪切范围的数据转换为表格式:
execute function Transpose((select stock_data from daily_stocks
             where stock_name = 'GBase'), 
             datetime(2011-01-05) year to day, 
             NULL::datetime year to fraction(5));

语句以行数据类型格式返回以下数据:

ROW('2011-01-06 00:00:00.00000',99.00000
000000,54.00000000000,66.00000000000,888.0000000000)

示例 3:将时间系列和其他数据转换为表格式

以下示例使用表格式返回时间系列的列以及非时间系列的列:
execute function Transpose ('select * from daily_stocks',  NULL::row(stock_id
int, stock_name lvarchar, 
   t datetime year to fraction(5), high real, low real, final real, volume real));

示例 4:将特定数据显示为单个列内的多个字段

以下语句从时间系列选择时间和能量读数:

SELECT mr.t,mr.energy
  FROM TABLE(transpose
              ((SELECT readings FROM smartmeters
                WHERE meter_id = 13243))::smartmeter_row) 
            AS tab(mr);

语句返回名为 tab 的表,其包含一个名为 mr 的列。mr 列是未命名的行类型,其与名为 smartmeter_rowTimeSeries 子类型具有相同的字段。输出具有时间字段和能量字段:

t                               energy

2011-01-01 00:00:00.00000          29
2011-01-01 00:15:00.00000          18
2011-01-01 00:30:00.00000          13
2011-01-01 00:45:00.00000          26
2011-01-01 01:00:00.00000          21
2011-01-01 01:15:00.00000          15
2011-01-01 01:30:00.00000          20
2011-01-01 01:45:00.00000          24
2011-01-01 02:00:00.00000          30
2011-01-01 02:15:00.00000          30
2011-01-01 02:30:00.00000          29
2011-01-01 02:45:00.00000          32
2011-01-01 03:00:00.00000          29

示例 5:在具有多个列的表中显示特定数据

以下语句从 FROM 子句的表表达式内的先前示例使用语句:

SELECT * FROM (
         SELECT mr.t,mr.energy,mr.temperature
             FROM TABLE(transpose
                 ((SELECT readings FROM smartmeters 
                   WHERE meter_id = 13243))::smartmeter_row)
                     AS tab(mr)
        ) AS sm(t,energy,temp)
  WHERE temp < -10;

语句使用包含三个列且名为 sm 的表格式返回以下数据:

t                              energy          temp

2011-01-01 00:00:00.00000          29  -13.0000000000
2011-01-01 00:30:00.00000          13  -18.0000000000
2011-01-01 01:00:00.00000          21  -13.0000000000
2011-01-01 01:15:00.00000          15  -11.0000000000
2011-01-01 03:15:00.00000          22  -19.0000000000
2011-01-01 03:45:00.00000          28  -14.0000000000
2011-01-01 04:00:00.00000          19  -14.0000000000
2011-01-01 04:30:00.00000          27  -14.0000000000
2011-01-01 04:45:00.00000          27  -15.0000000000
2011-01-01 05:00:00.00000          28  -11.0000000000