get 행으로 테이블 업데이트안녕하세요,
50k보다 큰 행과 5-10 개의 열이있는 두 개의 테이블이 있고 첫 번째 테이블 (dt1)을 두 번째 테이블 (dt2)의 값으로 업데이트하려고합니다. 행> 50k로 많은 시간이 걸릴 수 있기 때문에 루프를 사용하고 싶지 않습니다. JSL "update"기능은 잘 작동하지만 나중에 더 사용하려면 dt2에서 일치하는 행이 필요합니다.
내가 의미하는 바를 보여주기 위해 "script index"의 "update"예제를 사용하고 키, 무게, 순위 및 코드와 함께 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 행으로 테이블 업데이트다음은 이름이 고유 식별자로 작동한다고 가정 할 때 도움이되는 한 가지 방법입니다.
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);Re : get 행으로 테이블 업데이트업데이트 대신 조인을 사용하는 것이 좋습니다. 올바르게 설정하면 업데이트처럼 작동하지만 새 행이 추가됩니다. 또한 추가 된 행을 나타내는 열도 제공합니다.
단점은 새로운 데이터 테이블을 생성하지만 처리 할 수있는 몇 개의 명령문으로 업데이트가 완료된 것처럼 보이고 느끼게된다는 것입니다. 아래 코드를보십시오 :
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 행으로 테이블 업데이트고마워, 이것은 많은 행 수에도 잘 작동합니다.Re : get 행으로 테이블 업데이트고마워, 나는이 접근법을 시도했지만 50k 행 이상에는 너무 오래 걸릴 것입니다. 작은 테이블의 경우 잘 작동합니다.