篠崎愛(Shinozaki Ai) : 시노자키 아이

오라클의 샘플함수와 사용방법이 다르다.

 

SAMPLE {n[, n2, n3...] | d[, d2, d3...]}

건수와 비율로 설정할 수 있는데

정수일 경우 건수, 소수(0~1)일 경우 비율건수다.

 

예)

SELECT * FROM table SAMPLE 10;

=> 10건의 행을 랜덤하게 추출한다.

 

SELECT * FROM table SAMPLE 0.1;

=> 10%건의 행을 랜덤하게 추출한다. 0.1대신 .1로 써도 된다.

=> %결과가 소수점이 나오는 경우 .4999 이상이면 올림된다. => 반올림 된다는 말.

 

 

 

SAMPLEID라는 키워드를 사용할 수 있다.

 

예) SELECT cols, SAMPLEID FROM table, SAMPLE 2, 3, 1 ORDER BY SAMPLEID;

결과)

cols   SAMPLEID

----  ---------

a       1

b       1

ab      2

c       2

abb    2

ccc    3

 

총 행 수 보다 SAMPLE에서 뽑아내는 행 수가 더 많으면 경고가 발생한다.

Warning: 7473 Requested sample is larger than table row. All rows returned.

 

소수 값의 합이 1을 넘거나 정수와 소수를 섞어 사용하면 실패한다.

Failure 5473 SAMPLE clause has invalid set of arguments.

 

 

 

SAMPLE절에 WITH REPLACEMENT를 함께 쓰면 결과에 중복값도 포함된다. (확실치 않음)

예) SELECT cols FROM table SAMPLE WITH REPLACEMENT 5;

결과)

cols

----

a

a

b

ab

b

 

 

 

다음과 같은 경우에는 의도와는 다른 결과가 나온다.

SELECT SUM(col) FROM table SAMPLE 10; // 10개의 샘플을 뽑아 더할 것을 의도했다.

그러나 위의 쿼리는 전체 테이블의 SUM값이 나온다.

Warning: 7473 Requested sample is larger than table rows. All rows returned

 

그럼 어떻게 처리해야할까?

SELECT SUM(col) FROM (SELECT col FROM table SAMPLE 10);

위와 같이 10개의 결과를 가지는 서브쿼리(테이블)를 만들어 SUM시키면 된다.

 

 

이렇게도 쓸수있다. RANDOMIZED ALLOCATION - 무슨 기능인지 몰라서 설명은 패스...

SAMPLE WITH REPLACEMENT RANDOMIZED ALLOCATION 4, 5

 

 

그룹별 샘플링

예)

 

SELECT * FROM table

SAMPLE

WHEN col BETWEEN 0 AND 10 THEN 0.2

WHEN col BETWEEN 10 AND 100 THEN .4

WHEN col BETWEEN 100 AND 1000 THEN 0.25, 0.1

END

ORDER BY col;

=> col이 0~10인 그룹에서 20%건, 10~100인 그룹에서 40%건, 100~1000인 그룹에서 25%, 10%건을 추출한다.

예2)

SELECT * FROM table

SAMPLE WITH REPLACEMENT

WHEN col < 100 THEN 10

WHEN col < 200 THEN 5, 5

ELSE 1, 2, 3

END;





[출처] [Teradata] SAMPLE 함수|작성자 Ehne