二进制算术函数

标准二进制算术函数 Atan2PlusMinusTimesDivideModPow 可以对时间系列数据执行运算。PlusMinusTimesDivide 函数还可以分别通过其标准运算符 +、-、* 和 / 表示。

语法

Function(ts TimeSeries, 
        ts TimeSeries) 
returns TimeSeries;

Function(number  scalar, 
        ts            TimeSeries) 
returns TimeSeries;

Function(ts            TimeSeries, 
        number  scalar) 
returns TimeSeries;

Function(row  row, 
        ts            TimeSeries) 
returns TimeSeries;

Function(ts            TimeSeries, 
        row  row) 
returns TimeSeries;
ts
源时间系列。对于这种函数变体,两个参数中的一个必须是时间系列。这两个输入在函数中必须兼容。
number
标量号。必须与源时间系列兼容。
row
行类型。必须与源时间系列兼容。

描述

在第一种格式中,两个参数都是时间系列。结果是以较晚的输入起始时间开始的时间系列。如果两个输入都是不规则的,那么结果的结束点是两个输入结束点中较晚的一个。如果一个或多个输入是规则的时间系列,那么结果的结束点是规则的输入时间系列结束点中较早的一个。结果时间系列对于时间间隔中的每个输入时间点都有一个时间点。

在生成的时间系列中时间 t 的元素从两个输入时间系列中的时间 t 或之前的最后几个元素形成。正常情况下,函数对时间戳记之外的输入列逐列应用,以生成输出元素。在这种情况下,两个输入行类型必须具有相同的列数,并且对应的列必须在函数中兼容。

然而,如果存在函数的变体直接对两个输入时间系列中的行类型执行运算,那么将使用该变体。然后输入行类型可以具有不同的列数,并且这些列可能是不兼容的。生成的元素的时间戳记将被忽略;在生成的时间系列中放置的元素具有输入元素中较晚的时间戳记。

生成的日历是输入时间系列日历的并集。如果输入日历是相同的,那么生成的日历与输入日历相同。否则,将生成新日历。生成的日历的名称是包含输入时间系列的日历名称的字符串,各名称之间以垂直线 (|) 分隔。例如,如果连接两个时间系列,mycalyourcal 是其对应日历的名称,那么生成的日历命名为 mycal|yourcal

如果两个输入时间系列都是规则的,那么生成的时间系列是规则的;如果任何一个输入时间系列是不规则的,那么生成的时间系列是不规则的。

某一个输入可以是标量号或行类型。在这种情况下,生成的时间系列具有与输入时间系列相同的日历、时间戳记顺序和规则性。如果某一个输入是标量号,那么函数将应用到标量号和每个输入时间系列元素的每个非时间戳记列。

如果输入是行类型,那么该行类型必须与时间系列行类型兼容。该函数将应用到输入行类型和输入时间系列的每个元素。该函数将逐列应用或直接应用到两个行类型,这取决于是否存在直接处理行类型的函数变体。

返回结果

与第一个时间系列输入类型相同的时间系列;除非对函数进行了强制转型,那么它会返回将其强制转型到的时间系列类型。

例如,假设时间系列 tsi 类型为 TimeSeries(ci),时间系列 tsr 类型为 TimeSeries(cr),其中 ci 是包含 INTEGER 列的行类型,cr 是包含 SMALLFLOAT 列的行类型。那么 Plus(tsi, tsr) 的类型为 TimeSeries(ci);将丢弃生成编号的小数部分。这通常不是需要的效果。Plus(tsi, tsr)::TimeSeries(cr) 类型为 TimeSeries(cr) 且不会丢弃生成编号的小数部分。

示例

假设您要了解股票价格的日均值。以下语句将每天的股票高低值分别放入 daily_high 表和 daily_low 表中的不同时间系列:
create row type price( timestamp datetime year to fraction(5), 
   val real);
create row type simple_series( stock_id int, data 
   TimeSeries(price));

create table daily_high of type simple_series;

$insert into daily_high
    select stock_id,
          Apply('$high',
                '2011-01-03 00:00:00.00000'
                ::datetime year to fraction(5),
                '2011-01-10 00:00:00.00000'
                ::datetime year to fraction(5),
                stock_data)::TimeSeries(one_real)
        from daily_stocks;

create table daily_low of type simple_series;

insert into daily_low
    select stock_id,
      Apply('$low',
       '2011-01-03 00:00:00.00000'
       ::datetime year to fraction(5),
       '2011-01-10 00:00:00.00000'
       ::datetime year to fraction(5),
       stock_data)::TimeSeries(price)
   from daily_stocks;

以下查询使用符号格式的 PlusDivide 函数在 daily_avg 表中生成日均股票价格的时间系列:

create table daily_avg of type simple_series;

insert into daily_avg
    select l.stock_id, (l.data + h.data)/2
        from daily_low l, daily_high h
        where l.stock_id = h.stock_id;