둘 다 ID 열이있는 두 개의 테이블이 있습니다. 두 번째 테이블에 ID가있는 한 테이블의 행을 선택하고 싶습니다.SAS : ID가 다른 테이블에있는 행을 선택하십시오.
I R 이렇게하면 tbl1 [tbl $ ID % in % tbl2 $ ID]이라고 표시되지만, 이것을 SAS로 변환 할 수있는 방법을 찾지 못했습니다.
둘 다 ID 열이있는 두 개의 테이블이 있습니다. 두 번째 테이블에 ID가있는 한 테이블의 행을 선택하고 싶습니다.SAS : ID가 다른 테이블에있는 행을 선택하십시오.
I R 이렇게하면 tbl1 [tbl $ ID % in % tbl2 $ ID]이라고 표시되지만, 이것을 SAS로 변환 할 수있는 방법을 찾지 못했습니다.
이 시도 :
PROC SQL;
CREATE TABLE result AS
SELECT t2.*
FROM table1 AS t1, table2 AS t2
WHERE t1.id = t2.id
;
QUIT;
data out;
merge table1 (in=t1) table2 (in=t2);
by id;
if t1 and not t2;
run;
이는 두 데이터 세트가 id' 순서 '에있는 경우 작업 (또는 적절한 인덱스가) 있습니다과 영업 이익이 원하는 것과 반대를하지 ... 그것은하지 * 한 세트에서 항목을 제외 * 다른 쪽 ... OP에서는 한 데이터 집합의 행을 원하지만 병합에서 겹쳐 쓰는 추가 열이나 값을 원하지 않을 수도 있습니다. –
이것은 존 클레멘트가 제시 한 수정과 홍콩 오오이의 방법에 대한 확장입니다. SQL을 사용하는 것보다 데이터 단계를 사용하는 것이 더 빠름을 발견했습니다. 또한 데이터를 출력하는 데 더 많은 옵션을 제공합니다. 예를 들어,이 솔루션은 table1에 table2에없는 모든 ID를 보유하는 "match_error"라는 테이블을 작성합니다.
proc sort data=table1;
by id;
run;
proc sort data=table2;
by id;
run;
data result match_error;
merge table1 (in=in_T1) table2 (in=in_T2 keep=id);
by id;
if in_T1 and in_T2 then output result;
if in_T1 and not in_T2 then output match_error;
run;
여기서는 멤버십 테스트의 부작용에 대해서만 사용되므로 기본 작업이 아닌 가입을 피하는 것이 더 효율적이라는 것에주의 할 것입니다. 'select * from t1 where id (select id from t1)'는 옵티마이 저가 쿼리의 계획을보다 효율적으로 계획 할 수 있어야하며, 쿼리의 의도에 대해보다 명확하게 (imho) 명확합니다. –