1.분석함수
칼럼 vs 칼럼말고 행과 행간의 관계를 비교하기 힘듬.
분석함수 중첩사용 불가, 서브쿼리에서 사용가능
select 분석함수 over [(partition 절) /(order by절) /(windowing 절)] from 테이블;
-analytic_function: avg, count, lag, lead, max, min, rank, ratio_to_report, row_numbers, sum
arguments 0~3개까지 올 수 있다. count(*)만 허용, distinct는 함수가 허용해줄떄만
-partition by: 쿼리결과를 <exp_list> 별로 그룹핑한다. 생략시에는 하나의 그룹으로 리턴
-order by: order by < expr_list> [ASC | DESC | NULLS FIRST | NULLS LAST] : 표현식에는 별칭 안됨.
-windowing: row는 물리적단위(row위치), range는 논리적단위(row값)
rows[range] between start_point and end_point
-start_point: 그룹별 시작점. unbounded preceding, current row, value_expr, preceding value_expr following
-end_point: 그룹별 마지막점.
over: 해당함수가 쿼리결과 집합에 따라서 적용되는 지시어. from, where, group by, having 이후에 계산.
select, order by 구문뒤에 사용가능
q1) rank로 급여가 많은사원순으로 순위조회
partition- order by 순으로 적용됨.
1114 순으로 책정됨, 동일한 순위수만큼 건너뛴다 (RANK)
2.여러테이블 만들기
CREATE TABLE TEST03 (MYNAME, MYNO) AS
SELECT ENAME, EMPNO FROM EMP; #별칭
CREATE TABLE TEST04 AS
SELECT ENAME, EMPNO, JOB FROM EMP
WHERE ENAME= 'SCOTT'; #조건주기
3.CREATE TABLE 시 제약조건 소멸
4. DENSE_RANK (건너뛰는 RANK가 없다. 1111 22 3)
5.CUME_DIST(): CUMULATIVE DISTRIBUTION FUNCTION :
구하고자하는 값보다 작거나 같은값을 가진 ROW수를 그룹내 전체 ROW수로나눈것
SELECT ENAME, SAL, CUME_DIST() OVER (ORDER BY SAL)
FROM TEST_EMP
WHERE DEPTNO=20;
6.NTILE()
103개의 ROW, NTILE(5) => 근사치로 배분, 남는값부터 하나씩
1(21) 2(21) 3(21) 4(20) 5(20)
EX)봉급을 4등급으로 분류
SELECT ENAME, SAL, NTILE(4) OVER (ORDER BY SAL) FROM EMP;
7.ROW_NUMBER() : ROW_NUM과 무관
EX) 조회시 순번을 매기기(ROW_NUMBER) , 급여순, BUT 급여 같으면 입사일 빠른사람 순번
SELECT EMPNO, ENAME, SAL, HIREDATE,
ROW_NUMBER() OVER (ORDER BY SAL DESC, HIREDATE ASC) AS "순번"
FROM TEST_EMP;
8.WINDOW 함수