テーブルを結合するにはどうすればよいですか
A と B という 2 つのテーブルがあります。 B で 1 回以上表される ID を持つすべての行を A で検索し、それらの行を B に追加して新しいテーブル C を生成する JSL を作成したいと考えています。
たとえば、これを 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 テーブルの速度とメモリに関して十分に拡張できる必要があります。
Re: テーブルを結合するにはどうすればよいですか連想配列オプションは非常に優れていますが、私はこの概念をあまり使用したことがなく、結合の代替として使用したこともありません。 結合を使用するオプションは、私が自分で解決しようとしていたアプローチだったため、非常に役に立ちましたが、混乱してしまいました。
比較的単純ではあるものの、これには「ワンステップ」の解決策や独自の解決策があるわけではないことを確認していただいたお二人に感謝いたします。
お二人ともありがとうございました!
ジョン
Re: テーブルを結合するにはどうすればよいですか連想配列オプションは非常に優れていますが、私はこの概念をあまり使用したことがなく、結合の代替として使用したこともありません。 結合を使用するオプションは、私が自分で解決しようとしていたアプローチだったため、非常に役に立ちましたが、混乱してしまいました。
比較的単純ではあるものの、これには「ワンステップ」の解決策や独自の解決策があるわけではないことを確認していただいたお二人に感謝いたします。
お二人ともありがとうございました!
ジョン
Re: テーブルを結合するにはどうすればよいですかこれは、機能するスクリプトの結合中心バージョンです。かなり効率的であるはずです。
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 );
Re: テーブルを結合するにはどうすればよいですかこれは比較的計算効率が高いはずですが、まったくこの方法で実行する必要はありません。基本的な考え方は、ID がテーブル B にもあるテーブル A のサブセットであるテーブルを作成することです。次に、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);他のアプローチとしては、基準に一致しないデータを非表示にして除外することが考えられます。これにより、サブセット テーブルを作成する必要がなくなりますが、連結には非表示データと除外データが付属します。非表示および除外された行を選択して削除することもできますが、削除したくない他の行が非表示および除外されている場合、これはあまり堅牢な解決策ではない可能性があります。
3 番目のオプションは、A の行に B に存在する ID があるかどうかを示す列式を作成し、その列の値に基づいて一致しない C の結果の行を削除することです。
この猫の皮を剥ぐ方法は他にもたくさんあると思いますが、これでうまくいくことを願っています。