Intersect 函数

Intersect 函数在每个时间系列的整个长度或每个时间系列的剪切部分执行指定时间系列的交集运算。

语法

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

Intersect(set_ts set(TimeSeries)) 
returns TimeSeries;

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

Intersect(begin_stamp  datetime year to fraction(5), 
         end_stamp   datetime year to fraction(5), 
         set_ts      set(TimeSeries)) 
returns TimeSeries;
ts
形成交集的时间系列。Intersect 可以采用二到八个时间系列参数。
set_ts
指示一组时间系列的交集。
begin_stamp
剪切的起始点。
end_stamp
剪切的结束点。

描述

函数的第二个和第四个格式与一组时间系列相交。生成的时间系列在每个时间系列中的每个列后面都有一个 DATETIME YEAR TO FRACTION(5) 列,不包括其他时间戳记。使用第二个或第四个格式时,一定要确保集中时间系列的顺序是确定的,这样元素才能保持正确的顺序。

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

Intersect 可视为对时间戳记列执行连接。

如果任何输入时间系列是不规则的,那么生成的时间系列将是不规则的。

为了执行 Intersect,给定时间点的值是最近的有效元素的值。对于常规时间系列,此值对应于当前时间间隔(可为 NULL);无需是最近的非空值。对于不规则的时间系列,此状况永远不会出现,因为不规则的时间系列没有空的时间间隔。

例如,考虑两个不规则的时间系列的交集,一个包含某个库存的竞价,一个包含要价。两个时间系列的交集包含每个竞价或要价时间点的竞价值和要价值。现在,考虑只有竞价而没有要价的时间点。该时间点的交集包含该时间点提供的竞价和最近的要价。

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

在交集中,生成的时间系列的日历是使用 AND 运算符组合的输入时间系列的日历。生成的日历将存储在 CalendarTable 表中。生成日历的名称是包含使用 & 符号连接的输入时间系列日历名称的字符串。例如,如果两个时间系列相交,mycalyourcal 是其对应日历的名称,那么生成的日历命名为 mycal&yourcal

要在使用包含 set_ts 参数的 Intersect 时确保生成的时间系列中列的顺序,请使用 ORDER BY 子句。

Apply 也会将多个时间系列组合到单个时间系列。因此,在 Apply 中使用 Intersect 通常是不必要的。

返回结果

从交集产生的时间系列。

示例

以下示例返回两个时间系列的交集:
select Intersect(d1.stock_data,
      d2.stock_data)::TimeSeries(stock_bar_union)
    from daily_stocks d1, daily_stocks d2
    where d1.stock_name='GBase' and d2.stock_name='HWP';
以下查询将两个时间系列相交并仅返回 2011-01-03 和 2011-01-05 之间时间戳记的数据:
select Intersect('2011-01-03 00:00:00.00000'
            ::datetime year to fraction(5),
            '2011-01-05 00:00:00.00000'
            ::datetime year to fraction(5),
            d1.stock_data,
            d2.stock_data
          )::TimeSeries(stock_bar_union)
   from daily_stocks d1, daily_stocks d2
   where d1.stock_name = 'GBase' and d2.stock_name = 'HWP';