如何合併表格
我有兩張表,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 中不匹配的結果行。
我確信還有很多其他方法可以給這隻貓剝皮,但希望這能成功。