如何合并表格
我有两张表,A 和 B。 我想编写 JSL 来查找 A 中其 ID 在 B 中出现一次或多次的所有行,然后将这些行附加到 B 以生成一个新表 C。
例如,设 A:
ID | 数据 | 天 |
1 | 红色的 | 太阳 |
2 | 橙子 | 周一 |
2 | 黄色的 | 星期二 |
3 | 蓝色的 | 星期三 |
4 | 靛青 | 星期四 |
4 | 紫色 | 周五 |
4 | 紫红色 | 星期六 |
5 | 青色 | 太阳 |
6 | 黑色的 | 周一 |
设 B 为:
ID | 数据 | 天 |
6 | 阿夸 | 星期二 |
1 | 粉色的 | 星期三 |
1 | 浅褐色的 | 星期四 |
4 | 白色的 | 周五 |
9 | 金子 | 星期六 |
10 | 银 | 太阳 |
我想要代码生成一个如下所示的表 C(行顺序无关紧要):
ID | 数据 | 天 |
6 | 阿夸 | 星期二 |
1 | 粉色的 | 星期三 |
1 | 浅褐色的 | 星期四 |
4 | 白色的 | 周五 |
9 | 金子 | 星期六 |
10 | 银 | 太阳 |
1 | 红色的 | 太阳 |
4 | 靛青 | 星期四 |
4 | 紫色 | 周五 |
4 | 紫红色 | 星期六 |
6 | 黑色的 | 周一 |
这看起来很简单,但我对最好的方法感到困惑。 对于超过 100 万行的 A 和 B 表,该方法应该在速度和内存方面具有良好的扩展性。
回复:如何合并表格关联数组选项非常简洁,我没有经常使用这个概念,也从来没有作为连接的一种替代方案。 使用连接的选项很值得一看,因为这是我试图为自己解决的方法,但很困惑。
我很感谢你们俩确认,虽然相对简单,但没有“一步式”或独特的解决方案。
感谢你们俩!
约翰
回复:如何合并表格关联数组选项非常简洁,我没有经常使用这个概念,也从来没有作为连接的一种替代方案。 使用连接的选项很值得一看,因为这是我试图为自己解决的方法,但很困惑。
我很感谢你们俩确认,虽然相对简单,但没有“一步式”或独特的解决方案。
感谢你们俩!
约翰
回复:如何合并表格这是一个以 Join 为中心的脚本版本,可以工作......它应该非常有效
names default to here(1);
dtA = data table("A");
dtB = data table("B");
// Create data tables with only the data required
dtAID = dtA << Subset(invisible, selected rows(0), columns(:ID));
dtBID = dtB << Subset(invisible, selected rows(0), columns(:ID));
// Create a data table with only IDs found in both tables
dtABID = dtAID << Join(invisible, with(dtBID ),
Merge Same Name Columns,
By Matching Columns( :ID = :ID ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
);
close( dtAID, nosave );
close( dtBID, nosave );
// Create a table with only 1 row for each ID found
dtSum = dtABID << Summary(invisible,
Group( :ID ),
Freq( "None" ),
Weight( "None" )
);
// Create a data table that only has the correct IDs
// from data table A
dtAMatches = dtA << Join(invisible,
with(dtSum ),
Merge Same Name Columns,
By Matching Columns( :ID = :ID ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
);
close( dtSum, nosave );
// Delete column Match Flag and N Rows
dtAMatches << delete columns("Match Flag", "N Rows");
// Concatenate table B with the matched data from table A
dtFinal = dtB << Concatenate( dtAMatches );
close( dtAMatches, nosave );
回复:如何合并表格我认为这应该在计算上相对有效,并且您不必完全按照这种方式进行。基本思想是创建一个表,该表是表 A 的子集,其中 ID 也在表 B 中。然后将 A 的子集连接到表 B。
dtA = Data Table("Table A");
dtB = Data Table("Table B");
b.ID = dtB:ID << Get Values;
b_ID_unique = associative array(b.ID) << Get Keys;
dtA << Select Where(Contains(b_ID_unique,:ID) > 0);
dtASelected = dtA << Subset( Selected Rows );
dtB << Concatenate(
dtASelected,
Output Table( "Table C" )
);
Close(dtASelected, No Save);其他方法可能是隐藏和排除不符合条件的数据。这消除了创建子集表的需要,但是隐藏和排除的数据伴随着串联而出现。您可以选择隐藏和排除的行并删除它们,但如果您不想删除其他隐藏和排除的行,那么这可能不是一个非常可靠的解决方案。
第三个选项是创建一个列公式,指示 A 中的行是否具有 B 中存在的 ID,然后根据该列中的值删除 C 中不匹配的结果行。
我确信还有很多其他方法可以给这只猫剥皮,但希望这能成功。