A:TSL语言中对于表连接实现已经有非常完整的功能,具体可参考:FAQ:
Q:天软表连接的应用(join)
上述功能是在sql语句中完成的,考虑到有些用户在使用时,希望通过模型来完成此功能,因此,这里做了一个转换处理。
即,封装模型,通过指定参数方式,实现两个表的合并,类似python中pandas.merge方法。
在使用之前,
用户需先封装模型TSMerge,下载附件导成用户函数:
附件:TSMerge.fun
其定义如下:
定义:TSMerge(leftData:Array,rightData:Array,how:String,left_on:String,right_on:String):Array
说明:将两个表按指定键(列或索引)合并,支持内连接、外连接、左连接、右连接等。
参数:
leftData:数组,左表
rightData:数组,右表
how:字符串,指定连接方式,默认为内连接,可选值如下:
"join":内连接,表示交集,返回两个表中都有匹配的行
"full join":外连接,表示全集,返回两个表中所有行的并集。
"left join":左连接,返回左表所有行以及右表中匹配的行
"right join":右连接,返回右表所有行以及左表中匹配的行
"cross join":生成笛卡尔积
left_on: 字符串或整型,左表连接列名,多列用;分隔,若是数字列,则不支持多列
right_on: 字符串或整型,右表连接列名,多列用;分隔,若是数字列,则不支持多列
返回:若合并成功则返回合并表,若参数输错,则返回错误提示。
合并后会产生"_Key"列,表示匹配的索引列,当两表列名相同时,左表加后缀_L,右表加后缀_R
使用示例:
示例01:合并匹配列名不一样,且为多列
Table1:=array(('A':1,'B':2,'C':7),
('A':10,'B':3,'C':12),
('A':10,'B':10,'C':12),
('A':4,'B':20,'C':34),
('A':5,'B':10,'C':4));
Table2:=Array(('G':10,'E':10,'C':3),
('G':15,'E':20,'C':3),
('G':4,'E':4,'C':20),
('G':5,'E':10,'C':3));
return TSMerge(Table1,Table2,"left join","A;B","G;E");
返回结果:
示例02:合并匹配列名一致
t1:=array(
("StockID":"SH000300","date":"2025-11-12","指数涨幅(%)":-0.13),
("StockID":"SH000300","date":"2025-11-13","指数涨幅(%)":1.21),
("StockID":"SH000300","date":"2025-11-14","指数涨幅(%)":-1.57),
("StockID":"SH000300","date":"2025-11-17","指数涨幅(%)":-0.65),
("StockID":"SH000300","date":"2025-11-18","指数涨幅(%)":-0.65));
t2:=array(
("StockID":"SH600519","date":"2025-11-12","close":1465.15,"涨幅(%)":0.42),
("StockID":"SH600519","date":"2025-11-13","close":1470.38,"涨幅(%)":0.36),
("StockID":"SH600519","date":"2025-11-14","close":1456.6,"涨幅(%)":-0.94),
("StockID":"SH600519","date":"2025-11-17","close":1471.0,"涨幅(%)":0.99),
("StockID":"SH600519","date":"2025-11-18","close":1476.0,"涨幅(%)":0.34));
return TSMerge(t1,t2,"left join","date");
返回结果:
注:使用DeleteColumnByField(t,"date_L;date_R"); 可以删除指定列。