카테고리 없음

sql Top-N, RANK, Sequence

boangod 2025. 9. 26. 14:09

 

TOP-N 분석

 

• 정렬된 결과의 일부를 검색하는 방법은 다양하지만 가장 기본적인 방법은인라인 뷰를 이용하는 것이다.

• 인라인뷰를이용하는이유는SQL문에서정렬이가장마지막에수행되기때문이다.

 

SELECT ROWNUM, [컬럼, 컬럼, ...]

FROM (SELECT ... ORDER BY ...)

WHERE ROWNUM <= N;

 

‐ 상/하위 N개의 행을 검색한다.

‐ 인라인뷰에 반드시 ORDER BY절이 필요하다.

‐ ROWNUM은 검색된 행의순서이다.

 

 

인라인뷰를 이용한 Top-N 분석

 

• 가장 높은 급여를 받는 3인을 검색

 

SELECT ROWNUM, eno, ename, sal

FROM (SELECT eno, ename, sal

FROM emp

ORDER BY sal DESC)

WHERE ROWNUM <= 3;

 

 

RANK()를 이용한 순위검색

 

RANK()                  OVER ([PARTITION BY 컬럼,컬럼 ...] ORDER BY ......)

DENSE_RANK()    OVER ([PARTITION BY 컬럼,컬럼 ...] ORDER BY ......)

ROW_NUMBER()  OVER ([PARTITION BY 컬럼,컬럼 ...] ORDER BY ......)

 

‐ RANK 함수를이용해서다양한순위를검색한다.

‐ RANK()

     . 순위검색에서 중복순위만큼 값을 증가시킨다.

‐ DENSE_RANK()

     . 동일순위를 하나의 순위 및 행으로 취급한다.

‐ ROW_NUMBER()

     . 동일값이라도 반드시 순위를 다르게 결정한다.

     . 정렬값이 동일한 경우 어떤 값이 우선이 될지 알 수 없다.

     . 오라클의 경우 ROWID에 따라 결정된다.

     . 동일한 값이 없도록 정렬을 추가하는 것이 좋다.

 

 

 

Ranking 검색

 

• 급여순위를 검색

• 부서별 급여순위를 검색

 

SELECT eno, ename, sal,

RANK() OVER (ORDER BY sal DESC) RANK,

DENSE_RANK() OVER (ORDER BY sal DESC) DRANK,

ROW_NUMBER() OVER (ORDER BY sal DESC) RRANK

FROM emp;

 

SELECT eno, ename, dno, sal,

RANK() OVER (PARTITION BY dno ORDER BY sal DESC) RANK

FROM emp;

 

• 사원의 연봉을 순위 별로 검색

• 부서별로 사원의 급여순위를 검색

‐ 부서명, 급여를 반드시 검색한다.

 

SELECT RANK() OVER (PARTITION BY d.dno ORDER BY sal DESC) RRANK,

d.dno, dname, eno, ename, sal

FROM dept d, emp e

WHERE d.dno=e.dno;

 

시퀀스(Sequence)

 

• 유일한값을 자동으로 생성한다.

• 보통 PK 값을 생성하는 데 사용된다.

• 응용프로그램을 대체한다.

• 캐시를 통해 성능을 높인다.

 

 

 

시퀀스생성과수정

 

CREATE [| ALTER] SEQUENCE 시퀀스

[ START WITH 시작_값

INCREMENT BY 증가_값

MAXVALUE [상한_값 | NOMAXVALUE]

MINVALUE [하한_값 | NOMINVALUE]

CYCLE | NOCYCLE

CACHE [cache_개수| NOCACHE] ];

 

‐ START WITH : 할당을 시작하는 값을 정의한다.

‐ INCREMENT BY : 생성되는 값의 증가 치를 결정한다. 지정하지 않으면 1에서 시작한다.

‐ MAXVALUE : 생성될 상한 값을 정의한다. 기본설정은 NOMAXVALUE이다.

‐ MINVALUE : 하한값을 정의한다. 기본 설정은 NOMINVALUE이다.

‐ CYCLE : 상한 값까지생성한이후 다시 하한값부터 재생성할것인지여부이다.

‐ CACHE : 메모리에 미리 생성될 값의 개수를 정의한다.

 

 

시퀀스 삭제와 확인, 사용

 

DROP SEQUENCE 시퀀스;

SELECT sequence_name, max_value, min_value, increment_by,

cache_size, last_number, cycle_flag

FROM user_sequences;

 

...... 시퀀스. NEXTVAL......

...... 시퀀스. CURRVAL......

 

‐ NEXTVAL : 시퀀스로부터 유일한 값을 할당받는다.

‐ CURRVAL : 시퀀스로부터 마지막으로 할당받은 값을 다시 할당받는다.

‐ 주로 INSERT문의 VALUES절이나 UPDATE의 SET절에서 많이 사용된다.

 

 

시퀀스생성

• 시퀀스를 생성하고 설정을 검색한다.

 

CREATE SEQUENCE emp_eno_seq

START WITH 1

INCREMENT BY 1

NOMAXVALUE

NOMINVALUE

NOCYCLE

CACHE 20;

 

CREATE SEQUENCE dept_dno_seq;

 

SELECT sequence_name, max_value, min_value, increment_by,

cache_size, last_number, cycle_flag

FROM user_sequences;

 

 

시퀀스이용

• emp table에 시퀀스를 이용해서 행을 입력

 

INSERT INTO emp (eno, ename)

VALUES (emp_eno_seq.nextval, '첫 번째');

 

SELECT emp_eno_seq.currval FROM dual;

 

ROLLBACK;

 

SELECT sequence_name, max_value, min_value, increment_by,

cache_size, last_number, cycle_flag

FROM user_sequences;