[ORACLE] 데이터를 SQL로 랜덤 샘플링하기 : SAMPLE 함수
오라클에서 테이블의 데이터를 확인하기 위해서 랜덤하게 데이터를 출력하고 싶을 때가 있습니다. 그럴 때 RANDOM하게 정렬을 해서 상위 10개의 열을 출력하는 등의 방법을 이용해서 랜덤하게 데이터를 뽑아볼 수도 있지만, 간단하게 SAMPLE 함수를 사용해서 테이블의 데이터를 추출하는 방법도 있습니다.
랜덤하게 SAMPLING 하기 위해서는 WITH 구문을 이용한 가상테이블로의 조회가 아닌 실제 ROWID가 있는 테이블을 대상으로 실행해야 합니다. 또한 SAMPLE 함수는 인자값으로 지정되는 것이 테이블 전체의 데이터 중에서 몇 퍼센트를 지정하여 추출할것인지에 대한 퍼센트이기 때문에 테이블의 데이터가 지나치게 적을 경우 퍼센트를 올려주어야 합니다. 물론, 테이블의 데이터가 매우 적다면 굳이 추출을 샘플링을 통해서 할 필요가 없겠지만요.
-- 임의의 테이블 생성
CREATE TABLE TEMP1 AS
SELECT '김아무개' AS "이름",'과장' AS "직급", 'M' AS "성별", 38 AS "나이", 4500000 AS "월급" FROM DUAL UNION
SELECT '박아무개','과장', 'F', 37, 4600000 FROM DUAL UNION
SELECT '이아무개','차장', 'F', 42, 5100000 FROM DUAL UNION
SELECT '유아무개','대리', 'M', 34, 3200000 FROM DUAL UNION
SELECT '최아무개','주임', 'M', 28, 2500000 FROM DUAL UNION
SELECT '박아무개','대리', 'M', 32, 2800000 FROM DUAL UNION
SELECT '이아무개','주임', 'F', 33, 2600000 FROM DUAL UNION
SELECT '김아무개','주임', 'F', 26, 2700000 FROM DUAL UNION
SELECT '박아무개','이사', 'M', 56, 5700000 FROM DUAL UNION
SELECT '최아무개','과장', 'M', 45, 4500000 FROM DUAL UNION
SELECT '임아무개','대리', 'M', 35, 3700000 FROM DUAL;
-- SAMPLE 함수를 이용한 PERCENT % 만큼의 랜덤추출
SELECT * FROM TABLE SAMPLE(PERCENT);
-- SAMPLE 함수를 이용한 추출
SELECT * FROM TEMP1 SAMPLE(20);
아래는 위 SAMPLE 함수를 동일한 퍼센트로 하여 실행한 결과입니다. 아래 결과에서 알 수 있듯이, 같은 SQL을 실행한다고 해도 결과는 각각 상이한 데이터와 카운트가 나옵니다.
SAMPLE 함수의 인자값인 PERCENT 는 테이블의 데이터 중에서 대략적인 PERCENT 의 데이터를 추출하는 것이지 정확하게 나눠지는 것은 아닙니다. 만약 아래와 같이 카운트를 한다면 그 결과값은 실행할때마다 달라집니다.
SELECT COUNT(1) FROM TEMP1 SAMPLE(20);
이처럼, SAMPLE 함수는 다량의 데이터 중에서 임의의 로우를 랜덤하게 추출하고자 할때 전체 데이터 카운트에서의 지정된 임의의 PERCENT 만큼 추출하여 리턴합니다.