테이블을 결합하는 방법
A와 B 두 개의 테이블이 있습니다. ID가 B에서 한 번 이상 표시된 A의 모든 행을 찾은 다음 해당 행을 B에 추가하여 새 테이블 C를 생성하는 JSL을 작성하고 싶습니다.
예를 들어 A라고 합시다.
ID | 데이터 | 낮 |
1 | 빨간색 | 해 |
2 | 주황색 | 월 |
2 | 노란색 | 화 |
삼 | 파란색 | 수 |
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);다른 접근 방식은 기준과 일치하지 않는 데이터를 숨기고 제외하는 것일 수 있습니다.이렇게 하면 하위 집합 테이블을 만들 필요가 없지만 숨겨진 데이터와 제외된 데이터가 연결과 함께 제공됩니다.숨겨진 행과 제외된 행을 선택하고 삭제할 수 있지만 삭제하고 싶지 않은 숨겨진 행과 제외된 다른 행이 있는 경우에는 그다지 강력한 솔루션이 아닐 수 있습니다.
세 번째 옵션은 A의 행에 B에 존재하는 ID가 있는지 나타내는 열 수식을 만든 다음 해당 열의 값을 기반으로 일치하지 않는 C의 결과 행을 삭제하는 것입니다.
나는 이 고양이의 가죽을 벗길 수 있는 다른 많은 방법이 있다고 확신하지만, 바라건대 이것이 요령이 될 것입니다.