블로그 이미지
가야금마스터

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

Tag

2015. 3. 20. 14:57 DB/오라클 SQL 명령어

예제 테이블


CREATE TABLE TEST(

A VARCHAR2(10),

B VARCHAR2(10)

);


INSERT INTO TEST VALUES ('2','516958');

INSERT INTO TEST VALUES ('1','123458');

INSERT INTO TEST VALUES ('1','123458');

INSERT INTO TEST VALUES ('1','458512');

INSERT INTO TEST VALUES ('2','468521');

INSERT INTO TEST VALUES ('2','735196');

INSERT INTO TEST VALUES ('1','794528');




RANK() 함수와 ROW_NUMBER() 함수 정의


RANK() 정의

RANK() 함수는 레코드 단위로 순차적으로 순위 (1부터 출력)를 부여하고 

레코드 단위로 같은 값에 대해서는 동일한 순위를 부여한다.

PARTIRION BY 를 사용하면 전체를 한 그룹으로 보는것이 아니라 PARTITION  BY 에 사용된

컬럼을 지준으로 다르게 그룹을 나누어 순위를 부여한다.

오라클 8i 부터 지원하는 분석함수


공동순위가 있으므로 순위에 비는 숫자가 생깁니다.

중복 값을 허용 하면서 비는 숫자를 없애려면

DENSE_RANK() 사용하면 된다.


RANK() 사용 예제


SELECT A, B, RANK() OVER(ORDER BY A, B) 순위 FROM TEST;

전체

A           B         순위

1     123458      1

1   123458      1

1   458512      3

1   794528      4

2   468521      5

2   516958      6

2   735196      7




SELECT A, B, RANK() OVER(PARTITION BY A ORDER BY A, B) 순위 FROM TEST;

PARTITION BY  적용  A 컬럼을 기준으로 그룹을 나눔

A           B         순위

1   123458      1

1   123458      1

1   458512      3

1   794528      4

2   468521      1

2   516958      2

2   735196      3




ROW_NUMBER() 정의

ROW_NUMBER() 는 레코드 단위로 동일한 값이라도 매번 새로운  순위를 부여한다.

ROW_NUMBER() 함수는 각 PARTITION 내에서 ORDER BY 절에 의해 

정렬된 순서로 유일한 값을 돌려주는 함수이면 ROWNUM 과는 관계가 없습니다.

오라클 8i 부터 지원하는 분석 함수


중복 순위가 없고 모든 값은 유일값을 가지게 된다.


SELECT A, B, ROW_NUMBER () OVER (ORDER BY A, B) 순번 FROM TEST;

전체

A           B         순번

1   123458     1

1   123458     2

1   458512     3

1   794528     4

2   468521     5

2   516958     6

2   735196     7




SELECT A, B, ROW_NUMBER() OVER(PARTITION BY A ORDER BY A, B) 순번 FROM TEST;

PARTITION BY  적용  A 컬럼을 기준으로 그룹을 나눔

A           B         순번

1   123458     1

1   123458     2

1   458512     3

1   794528     4

2   468521     1

2   516958     2

2   735196     3




NTILE () 정의

NTILE 함수는 쿼리의 결과를 N개의 그룹으로 분류하는 기능을 제공


SELECT A, B,

NTILE(2) OVER (ORDER BY A) 그룹1,

NTILE(3) OVER (ORDER BY A) 그룹2,

NTILE(5) OVER (ORDER BY A) 그룹3

FROM TEST;

결과 값 : 

A

그룹1 

그룹2 

그룹3 

1

794528

1

1

1

123458

1

1

1

458512

1

2

1

123458

2

2

2

735196

2

3

2

516958

3

4

2

468521

3

5




* OVER() 함수는 필수 입니다.

* OVER() 함수안의 PARTITION BY 는 미필수 이지만 ORDER BY는 필수 이다.

* PARTITION BY 를 사용하면 출력결과를 하나의 그룹으로 보는것이 아니라

PARTITION BY 에 사용된 컬럼을 기준으로 그룹을 나누어지게 된다.

(순위도 그룹별로 별개로 1부터 부여된다.)



ROW_NUMBER() 응용 예제


A, B 그룹별 A, B 의 출력을 상위 2개만 출력하기


SELECT A, B FROM(

SELECT A, B, ROW_NUMBER() OVER (PARTITION BY A ORDER BY B) 전체 FROM TEST) 

WHERE 전체 <= 2;

결과 값 :

A        B

1 123458

1 123458

2 468521

2 516958




SELECT A, B FROM (

SELECT A, B, ROW_NUMBER() OVER (PARTITION BY A ORDER BY A, B) "중복 제외"

FROM TEST GROUP BY A, B) WHERE "중복 제외" <= 2;

결과 값 :

A        B

1 123458

1 458512

2 468521

2 516958




ROW_NUMBER  응용예제 2

직업별로 급여 합계를 계산해서 급여 합계가 많은 순으로 가장 많은 직업 3개만 출력하기


ROW_NUMBER 사용 안할시

SELECT JOB, "급여 합계" FROM 

(

SELECT JOB, SUM(SAL) "급여 합계" FROM EMP

GROUP BY JOB

ORDER BY "급여 합계" DESC

WHERE ROWNUM < 4;


ROW_NUMBER  사용


SELECT JOB, "급여 합계" FROM

(

SELECT JOB, SUM(SAL) "급여 합계", 

ROW_NUMBER() OVER (ORDER BY SUM(SAL) DESC) NUM

FROM EMP

GROUP BY JOB

)

WHERE NUM < 4;


결과 값 : 

    JOB          결과 합계

MANAGER        8275

ANALYST        6000

SALESMAN        5600




PARTITION BY

PARTITION BY는 select한 결과를 특정 column을 기준으로 나누는 역할을 한다. 여기서는 userid를 기준으로 partition을 나눴다. 그리고 나뉜 partition은 score column을 기준으로 내림차순으로 정렬을 하고, 정렬된 내용을 RANK() OVER를 통해 순서를 매긴다. 마지막으로 한 번 더 select하여 상위 3개를 가져온다






'DB > 오라클 SQL 명령어' 카테고리의 다른 글

오라클 PK 제약조건 만들기  (0) 2015.03.19
오라클 DDL 정의  (0) 2015.03.19
오라클 AUTO_INCREMENT (인서트 자동증가)  (0) 2015.03.19
날짜 명령어 사용 예  (0) 2015.03.16
날짜관련 명령어  (0) 2015.03.16
posted by 가야금마스터