FAQ > 金融建模 > 应用案例 > 数据处理

Q:如何将两个非包含关系的表格合并成一个表    

简述
在数据合并时会遇到,在使用full join进行两个表连接时,两表主键由于非包含关系,导致合并后的数组中,主键列出现nil值的情况,不符合合并的预期,这里提供两种实现方式,满足该类数组的合并需求
  • 案例说明:
    两表特点:表1与表2需要按主键'date'进行合并,此处两表长度不一,有重合,但不存在包含关系
    对于这类数据的处理,我们有两种解决办法:
    方法一:先对主键进行求并集后,再一一将表1与表2合并到主键表中,完成全表合并
    案例实现:

      setsysparam(pn_stock(),'SZ000002');
      
      //表1:20201209T起最近5日的收盘价表格
      setsysparam(pn_date(),20201209T);
      t1:=nday(5,'date',sp_time(),'close',close());

      //表2:20201205T起最近7日的收盘价表格
      setsysparam(pn_date(),20201205T);
      t2:=nday(7,'date',sp_time(),'open',open());

      //得到主键表格序列,并为了好看排了个序
      t0:=select thisrow as 'date' from t1[:,'date'] union2 t2[:,'date']
        order by thisrow end;

      //通过左合并,将表1与表2连接进来,天软支持一次进行多表连接
      return select [2].*,[3].* ,datetostr([1].['date']) as 'date' from t0
          left join t1 with ([1].['date'] on [2].['date'])
          left join t2 with ([1].['date'] on [3].['date']) end;

    返回结果:


    方法二:在合并时,对主键进行判定后选择有值的替代
    案例实现:

    setsysparam(pn_stock(),'SZ000002');
      //表1:20201209T起最近5日的收盘价表格
      setsysparam(pn_date(),20201209T);
      t1:=nday(5,'date',sp_time(),'close',close());

      //表2:20201205T起最近7日的收盘价表格
      setsysparam(pn_date(),20201205T);
      t2:=nday(7,'date',sp_time(),'open',open());
      
      t:= select [1].*,[2].*,
      //若表1的date值为空,则用表2中的值替代,并转成字符串格式输出
          datetostr([1].['date']?:[2].['date']) as 'date'
          from t1 full join t2 with ([1].['date'] on [2].['date'])
          end;
      //排序
      return select * from t order by ['date'] end;

    返回结果与上图结果一致。