get行によるテーブルの更新やあ、
> 50k行と5-10列の2つのテーブルがあり、最初のテーブル(dt1)を2番目のテーブル(dt2)の値で更新したいと思います。 行が50kを超えると時間がかかる可能性があるため、ループは使用したくありません。 JSLの「更新」機能はうまく機能しますが、さらに使用するには、dt2の一致する行も必要です。
私が何を意味するかを示すために、「スクリプトインデックス」の「更新」の例を使用し、身長、体重、ランク、コードを含む名前MIKEを追加しました。 一致した行の行番号のリストが必要です。 その例では、MIKEがdt1に存在しないため、{1、2、3}になります。
Names Default To Here( 1 );
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "Little Class",
Add Rows( 3 ),
New Column( "name", Character, Nominal, Set Values( {"KATIE", "ALFRED", "HENRY", "MIKE"} ) ),
New Column( "height", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "weight", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "RANK", Continuous, Set Values( [3, 1, 2, 9] ) ),
New Column( "CODE", Continuous, Set Values( [0, 1, 1, 8] ) )
);
dt1 << Update(
With( Data Table( "Little Class" ) ),
Match Columns( :name = :name ),
Add columns from Update table( {:RANK} ),
Replace columns in Main Table( {:height} )
);ありがとう
Re:get行を使用したテーブルの更新おかげで、私はこのアプローチを試しましたが、5万行を超えると時間がかかりすぎます。 小さいテーブルの場合、これはうまく機能します。Re:get行を使用したテーブルの更新おかげで、これは大量の行に対してもうまく機能します。Re:get行を使用したテーブルの更新Updateの代わりにJoinを使用することをお勧めします。正しく設定されていれば、アップデートのように機能しますが、新しい行が追加されます。また、追加された行を示す列も提供されます。
欠点は、新しいデータテーブルを作成することですが、いくつかのステートメントを使用すると、処理でき、更新が行われたように見えます。以下のコードを見てください。
Names Default To Here( 1 );
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "Little Class",
Add Rows( 3 ),
New Column( "name", Character, Nominal, Set Values( {"KATIE", "ALFRED", "HENRY", "MIKE"} ) ),
New Column( "height", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "weight", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "RANK", Continuous, Set Values( [3, 1, 2, 9] ) ),
New Column( "CODE", Continuous, Set Values( [0, 1, 1, 8] ) )
);
dt3 = dt1 << Join(
With( dt2),
Merge Same Name Columns,
By Matching Columns( :name = :name ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 1 ),
Preserve main table order( 1 )
);
name = dt1 << get name;
close(dt1, nosave );
dt3 << set name(name);
dt1 = dt3;Re:get行を使用したテーブルの更新名前が一意の識別子として機能すると仮定すると、次の1つの方法が有効になります。
Names Default To Here( 1 );
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "Little Class",
Add Rows( 3 ),
New Column( "name", Character, Nominal, Set Values( {"KATIE", "ALFRED", "HENRY", "MIKE"} ) ),
New Column( "height", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "weight", Continuous, Set Values( [999, 999, 999, 111] ) ),
New Column( "RANK", Continuous, Set Values( [3, 1, 2, 9] ) ),
New Column( "CODE", Continuous, Set Values( [0, 1, 1, 8] ) )
);
dt1 << Update(
With( Data Table( "Little Class" ) ),
Match Columns( :name = :name ),
Add columns from Update table( {:RANK} ),
Replace columns in Main Table( {:height} )
);
//Get names as associative arrays
names1 = Associative Array(dt1:name << Get values);
names2 = Associative Array(dt2:name << Get Values);
//Get the intersection (replaces names1)
names1 << Intersect(names2);
//Get intersection names as List
intersection = names1 << Get Keys;
//Find rows
update_rows = dt2 << Get Rows Where(contains(intersection, :name)>0);