CAFE

SAS: PROC SQL

proc sql의 꽃; JOIN

작성자안재형|작성시간16.08.01|조회수2,588 목록 댓글 2

/* proc sql을 쓰는 사람은 대부분 JOIN 즉 merge때문에 사용합니다.

 1 .merge로는 2개밖에 합치지 못하는데 SQL JOIN은 10개이상까지 합칠수 있는 것 같습니다.

 2. merge할 BY 변수로 sort할 필요도없고,

 3. merge할 변수의 이름이 달라도 되고, 상당히 융통성있는 merge가 가능합니다.

*/


/* 데이터 u1, u2를 다음과 같이 만들죠 */

data u1;
  input key $ value1 @@;
  datalines;
  A 11  B 12
;
data u2;
  input key $ value2 @@;
  datalines;
  C 23  A 21
;


/*** full join을 이용해보죠. 다음과 같이 u1, u2를 key라는 변수로 JOIN합니다. ***/
proc sql;
  select u1.*, u2.*
  from u1
    full join u2 on u1.key=u2.key
;quit;


/* u1.* u2.*라고 했으니 u1, u2에 있는 모든 변수를 다음과 같이 프린트합니다. 그런데 이게 원하는결과는 아니다. */

key         value1  key         value2
--------------------------------------
A               11  A               21
B               12                   .
                 .  C               23

/* 중요한 점은 */

select key, value1, value2  라고 하면 error입니다.

value1은 u1에 value2는 u2에 있어 괜찮지만, key는 두 데이터 모두에 있어 둘중 어떤것을 요구하는지 알수없습니다.


select m1.key, m1.value1, m2.value2  라고 할 수 있고

select m2.key, m1.value1, m2.value2 라고 할 수 있습니다. 물론 value1, value2의 m1, m2는 생략가능합니다.


그런데 m1에 있는 key와 m2에 있는 key를 합친 값을 원하면 아래와 같이 합니다.


/*** COALESCE(x1,x2)라는 함수를 사용하여 x1이 missing이면 x2의 값을 사용한다.***/
proc sql;
  select coalesce(u1.key,u2.key) as key,
         value1,
         value2
  from u1
    full join u2 on u1.key=u2.key
;quit;


/* 원하는 결과가 나왔다. */

key         value1    value2
----------------------------
A               11        21
B               12         .
C                .        23


/*** full join외에 LEFT JOIN이 있는데, Clinical Trails에서는 데이터 특성상 LEFT JOIN만 사용했습니다. ***/
proc sql;
  select coalesce(u1.key,u2.key) as key,
         value1,
         value2
  from u1
    left join u2 on u1.key=u2.key
;quit;


/* left join은 left에 있는 u1의 값을 중심으로 merge한다. */

key         value1    value2
----------------------------
A               11        21
B               12         .



/*** RIGHT JOIN도 있다. ***/
proc sql;
  select coalesce(u1.key,u2.key) as key,
         value1,
         value2
  from u1
    right join u2 on u1.key=u2.key
;quit;


/* left join은 right에 있는 u2의 값을 중심으로 merge한다. */
key         value1    value2
----------------------------
A               11        21
C                .        23


다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자강성찬 | 작성시간 16.08.02 저도 data merge 때문에 sql을 씁니다. data step에서 merge할려면 key변수로 sorting을 먼저 해야하는데 sql은 그럴 필요 없지요.
  • 답댓글 작성자안재형 작성자 본인 여부 작성자 | 작성시간 16.08.03 그런데 데이터 하나를 주물럭 거리거나 잘해야 하나 더 merge하는 경우가 대부분이어서 SQL의 필요성을 크게 못느끼는 경우가 많은듯합니다.
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼