TIMESERIES 子句
空白填充和插值 (GFI) 计算,这是时序分析计算的一个重要组件。有关详细信息和示例,请参阅时序分析。
语法
TIMESERIES slice‑time AS 'length‑and‑time‑unit‑expr' OVER (
[ PARTITION BY (column‑expr[,...] ] ORDER BY time‑expr ) [ ORDER BY table‑column[,...] ]
参数
- slice‑time
TIMESERIES
子句产生的时间列,用于存储空白填充生成的时间片开始时间。注意:此参数为别名,因此,您可以使用任何名称作为别名。
- length‑and‑time‑unit‑expr
INTERVAL DAY TO SECOND
字面量,用于指定时间片计算的时间单位长度。例如:TIMESERIES slice_time AS '3 seconds' ...
OVER()
- 指定功能分区和排序。
OVER()
还指定时序函数在查询结果集上的操作—换而言之,评估FROM
、WHERE
、GROUP BY
和HAVING
子句之后返回的行。 -
PARTITION BY (column‑expr[,...] )
- 按指定的列表达式对数据进行分区。分别在每个分区上执行空白填充和插值。
-
ORDER BY time‑expr
- 按
TIMESTAMP
表达式 time-expr 对数据排序,以计算时序数据的时间信息。注意
TIMESERIES
子句要求在时间戳列上进行ORDER BY
操作。
注意
如果在 TIMESERIES OVER() 内没有为每个定义的时间片指定 window-partition-clause,则只产生一个输出记录;否则,则按每个时间片的每个分区产生一个输出记录。插值在该处计算。
如提供包含 TIMESERIES 子句的查询块,则以下是语义执行阶段(评估 FROM 和可选 WHERE 子句之后):
-
计算 time-expression。
-
根据 time‑exp 和 'length‑and‑time‑unit‑expr' 的结果在每个输入记录上执行与 TIME_SLICE() 函数一样的计算。
-
执行空白填充以生成输入记录中缺失的时间片。
-
将此计算结果命名为 slice_time,表示空白填充之后生成的“时序”列(别名)。
-
-
按 expression、slice‑time 对数据分区。针对每个分区执行步骤 4。
-
按 time‑expr 对数据排序。插值在此处计算。
TIMESERIES 子句和 TIME_SLICE 函数之间存在语义重叠,主要区别如下:
-
TIMESERIES
仅支持间隔限定符DAY TO SECOND
;不允许YEAR TO MONTH
。 -
与
TIME_SLICE
不同,length‑and‑time‑unit‑expr 中表示的时间片长度和时间单位必须为常量,以便很好地界定时间片间隙。 -
TIMESERIES
执行空白填充,而TIME_SLICE
函数则不执行。 -
TIME_SLICE
可以根据其第四个输入参数 (start‑or‑end) 的值来返回时间片的开始和结束时间。TIMESERIES
,另一方面,始终返回每个时间片的开始时间。要输出每个时间片的结束时间,请写入SELECT
语句,如下所示:=> SELECT slice_time + <slice_length>;
限制
-
在 SQL 查询块中发生
TIMESERIES
子句时,仅以下子句可用于相同查询块中:-
SELECT
-
FROM
-
WHERE
-
ORDER BY
不允许使用“GROUP BY”和“HAVING”子句。如果在间隙填充和插值 (GFI) 之前或之后需要执行“GROUP BY”操作,请使用子查询,并且将“GROUP BY”放入外部查询。例如:
=> SELECT symbol, AVG(first_bid) as avg_bid FROM ( SELECT symbol, slice_time, TS_FIRST_VALUE(bid1) AS first_bid FROM Tickstore WHERE symbol IN ('MSFT', 'IBM') TIMESERIES slice_time AS '5 seconds' OVER (PARTITION BY symbol ORDER BY ts) ) AS resultOfGFI GROUP BY symbol;
-
-
TIMESERIES
子句出现在 SQL 查询块时,SELECT
列表仅可包含以下:-
时序聚合函数,例如
TS_FIRST_VALUE
和TS_LAST_VALUE
-
slice_time 列
-
PARTITION BY
表达式 -
TIME_SLICE
function
例如,以下两个查询返回语法错误,因为
bid1
不是PARTITION BY
或GROUP BY
列:=> SELECT bid, symbol, TS_FIRST_VALUE(bid) FROM Tickstore TIMESERIES slice_time AS '5 seconds' OVER (PARTITION BY symbol ORDER BY ts); ERROR: column "Tickstore.bid" must appear in the PARTITION BY list of Timeseries clause or be used in a Timeseries Output function => SELECT bid, symbol, AVG(bid) FROM Tickstore GROUP BY symbol; ERROR: column "Tickstore.bid" must appear in the GROUP BY clause or be used in an aggregate function
-
示例
例如,请参阅空白填充和插值 (GFI)。