Union 函数

Union 函数针对每个时间系列的全长或每个时间系列的剪切部分执行多个时间系列的并集。

语法

Union(ts TimeSeries,...) 
returns TimeSeries;

Union(set_ts set(TimeSeries)) 
returns TimeSeries;

Union(begin_stamp datetime year to fraction(5), 
       end_stamp   datetime year to fraction(5), 
       ts          TimeSeries,...) 
returns TimeSeries;

Union(begin_stamp datetime year to fraction(5), 
       end_stamp   datetime year to fraction(5), 
       set_ts      set(TimeSeries)) 
returns TimeSeries;
ts
形成并集的时间系列。Union 可以采用两个到八个时间系列自变量。
set_ts
时间系列集。
begin_stamp
剪切的起始点。
end_stamp
剪切的结束点。

描述

函数的第二个和第四个格式执行时间系列集的并集。生成的时间系列具有一个 DATETIME YEAR TO FRACTION(5) 列,依次后接每个时间系列中的每个列。使用第二个或第四个格式时,一定要确保集中时间系列的顺序是确定的,这样元素才能保持正确的顺序。

由于生成的时间系列类型与输入时间系列类型不同,因此必须强制转型并集的结果。

Union 可视为时间戳记上的外连接。

在并集中,生成的时间系列具有的日历是输入时间系列的日历与 OR 运算符的组合。生成的日历将存储在 CalendarTable 表中。生成的日历名称是包含输入时间系列日历名称的字符串,各名称之间以竖线 ( | ) 分隔。例如,如果两个时间系列组合在一起,且 mycalyourcal 是其相应日历的名称,那么生成的日历名为 mycal|yourcal。如果所有时间系列具有相同日历,那么 Union 不会创建新日历。

对于常规时间系列,如果时间系列在生成日历的时间点上没有有效元素,那么该时间系列元素的值为 NULL

要确定对集使用 Union 时生成的时间系列中的列顺序,请使用 ORDER BY 子句。

Union 可使用的给定时间点上的值是最近有效元素的值。对于常规时间系列,此值对应于当前时间间隔(可为 NULL);无需是最近的非空值。对于非常规时间系列,永不会发生此情况,因为非常规时间系列没有空时间间隔。

例如,考虑两个非常规时间系列的并集,一个包含某只股票的竞价,一个包含要价。这两个时间系列的并集包含每个时间点可以是竞价也可以是要价的竞价和要价值。现在,考虑只有竞价而没有要价的时间点。该时间点上的并集包含该时间点上提供的竞价以及最近的要价。

如果交集包含一个或多个常规时间系列,那么生成的时间系列从输入时间系列的最近开始点开始,并在常规输入时间系列的最早结束点结束。如果所有输入时间系列都是非常规的,那么生成的非常规时间系列从输入时间系列的最近开始点开始,并在最近结束点结束。如果并集包含一个或多个时间系列,那么生成的时间系列从输入时间系列的第一个开始点开始,并在输入时间系列的最近结束点结束。除开始点和结束点以及生成的日历的区别之外,包含时间系列的并集和交集之间没有任何区别。

Apply 也会将多个时间系列组合到单个时间系列。因此,通常不需要在 Apply 内使用 Union

返回结果

从并集生成的时间系列。

示例

以下查询构造两只不同股票的时间系列的并集:
select Union(s1.stock_data, 
   s2.stock_data)::TimeSeries(stock_bar_union)
from daily_stocks s1, daily_stocks s2
where s1.stock_name = 'GBase' and s2.stock_name = 'HWP';
以下示例会查找两个时间系列的并集,并仅针对 2011-01-03 与 2011-01-05 之间的时间戳记返回数据:
select Union('2011-01-03 00:00:00.00000'
         ::datetime year to fraction(5),
         '2011-01-05 00:00:00.00000'
         ::datetime year to fraction(5),
          s1.stock_data,
          s2.stock_data)::TimeSeries(stock_bar_union)
    from daily_stocks s1, daily_stocks s2
    where s1.stock_name = 'GBase' and s2.stock_name = 'HWP';