* 출처 : http://cafe.daum.net/statsas/3F8j/216
* PROC SQL에서 중복제거는 일반적으로 SUBQUERY나 JOIN 으로 일반적으로 처리하지만, MONOTONIC() 함수로 처리해보았습니다;
* MONOTONIC은 메모리에서 처리 순서에 따라서 씨퀀스 방식이 달라지므로 권해드리는 방식은 아님을 알려드립니다;
* PROC SQL에서 MONOTONIC은 정식 지원 옵션은 아님;
* http://support.sas.com/kb/15/138.html;
* Usage Note 15138: Support for the MONOTONIC() function in PROC SQL;
* [ 참고 ]
데이터 중복제거(first. / last대안) - MAX , MIN : http://cafe.daum.net/statsas/3F8j/162
[SQL] PROC SQL에서 nodupkye 사용(monotonic) : http://cafe.daum.net/statsas/3F8j/70
[MAX] 변수중에 2번째 큰값 찾기 http://cafe.daum.net/statsas/3F8j/163
DATA BACK;
INPUT VAR1 $ VAR2;
CARDS;
백승민 100
백승민 300
백승민 400
홍길동 500
홍길동 600
김나비 100
김나비 600
김나비 500
;
PROC SORT DATA= BACK OUT=BACK1;
BY VAR1;
RUN;
* PROC SQL로 구현(사전 PROC SORT);
PROC SQL;
CREATE TABLE BACK2 AS
SELECT A.*,
MONOTONIC() AS VAR3,
MIN(MONOTONIC()) AS VAR4
FROM BACK1 A
GROUP BY VAR1
HAVING MONOTONIC() = MIN(MONOTONIC());
quit;
* 데이터 스텝으로 구현;
DATA BACK3;
SET BACK1;
BY VAR1;
IF FIRST.VAR1;
RUN;
* PROC SQL로 구현(사전에 PROC SORT 사용 안함);
* SAS는 인라인뷰에서 ORDER BY 지원안함;
* 내부적으로 정렬 후에 MONOTONIC을 적용하기 위하여 INLINE 뷰 내부에 HAVING절을 삽입하고,
MONOTONIC에 RANK변수를 지정;
* -> 내부 처리 방식 문제라 정확한 해답이라고 확답을 못하겠네요;
* -> Key값에 중복 발생시에는 문제;
* _TREE로 확인 필요
PROC SQL;
SELECT A.*,
MONOTONIC(RANK) AS VAR3,
MIN(MONOTONIC(RANK)) AS VAR4
FROM ( SELECT A.*,
VAR1||PUT(A.VAR2,3.) AS RANK
FROM BACK A
GROUP BY 1,2
HAVING MIN(RANK) = RANK
) A
GROUP BY VAR1
HAVING MONOTONIC(RANK) = MIN(MONOTONIC(RANK));
QUIT;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.
Early bird rate extended! Save $200 when you sign up by March 31.