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

EXTRACT : 추출

 

EXTRACT([YEAR|MONTH|DAY|HOUR|MINUTE|SECOND] FROM date-value)

 

보면 알겠지만 date-value에서 원하는 부분을 추출한다.

 

예)

EXTRACT(YEAR FROM DATE'2010-12-20' + 30) = 2011

EXTRACT(MONTH FROM DATE'2010-12-20' - 30) = 11

EXTRACT(DAY FROM DATE'2010-12-20' + 30) = 19

 

EXTRACT(HOUR FROM TIME'10:20:30') = 10

EXTRACT(MINUTE FROM TIME'10:20:30') = 20

EXTRACT(SECOND FROM TIME'10:20:30') = 30

 

연, 달, 일은 DATE, 시, 분, 초는 TIME






[출처] [Teradata] EXTRACT|작성자 Ehne

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

 

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

다른 DB환경에서도 사용 가능한 것 같지만 일단 Teradata 교제에서 나오는 내용이니 Teradata로 분류

 

Char -> DATE

CAST('20100101' AS DATE FORMAT 'YYYYMMDD')

=> 20100101 // DATE형 - 출력 포맷은 툴에 따라 다를 수 있음.

 

Char -> Numeric

CAST('1234' AS DECIMAL(4, 2) FORMAT '9(2)V9(2)');

=> 12.34 // Numeric Overflow 주의. 가능한 명확한 포맷을 지정

 

Char -> TIME

CAST('01:00:00' AS TIME(0))

=> 01:00:00 // TIME(n)에서 n은 초에 대한 정밀도이다. 따라서 주어진 Char의 초의 정밀도가 n 이하여야 한다.

 

Char -> TIMESTAMP

CAST('2010-01-01 01:01:01.12345' AS TIMESTAMP(5));

=> 2010-01-01 01:01:01.12345 // TIMESTAMP(n)에서 n은 TIME과 마찬가지다.

 

DATE -> Char

CAST(CURRENT_DATE AS CHAR(10))

=> 2013-04-10

CAST(CAST(CURRENT_DATE AS FORMAT 'YYYY/MM/DD') AS CHAR(10)); // 결과 포맷을 다르게 하기 위해서 AS FORMAT을 추가

=> 2012/03/29

 

DATE -> TIMESTAMP

CAST(DATE '2010-01-01' AS TIMESTAMP(1));

=> 2010-01-01 00:00:00.0

 

Numeric -> Char

CAST(12345 AS CHAR(5))

=> 12345 // 명시적으로 CAST를 사용하지 않을 경우 일부 데이터에 대해서 truncation이 발생할 수 있으므로 주의

 

Numeric -> Numeric

CAST((A * B) / C AS DECIMAL(15, 2)); // A, B, C가 DEC(8, 2)일 때 결과값을 DEC(15, 2)로 변환하는 경우

 

TIMESTAMP -> Char

CAST(CURRENT_TIMESTAMP AS CHAR(26));

=> 2013-04-10-18.25.31.210000

CAST(CAST(CURRENT_TIMESTAMP AS FORMAT 'YYYY/MM/DDBHH:MI:SS.S(6)') AS CHAR(26));

=> 2013-04-10 18:25:31.210000 // 결과 포맷을 다르게 하기 위해서 AS FORMAT을 추가

 

TIMESTAMP -> DATE

CAST(CURRENT_TIMESTAMP AS DATE);

=> 2013-04-10

CAST(TIMESTAMP '2010-01-01 01:02:03' AS DATE);

=> 2010-01-01





[출처] [Teradata] CAST 함수 (데이터 타입 변환)|작성자 Ehne