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);
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 值。
标志 | 值 | 含义 |
---|---|---|
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() 不返回隐藏的元素。 |
包含时间系列元素的时间戳记和其他列的多个行。
execute function Transpose((select stock_data from daily_stocks where stock_name = 'GBase'));
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)
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));
以下语句从时间系列选择时间和能量读数:
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_row 的 TimeSeries 子类型具有相同的字段。输出具有时间字段和能量字段:
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
以下语句从 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