본문 바로가기

DB/SQLD

SQL 활용 - 윈도우 함수

반응형

윈도우 함수

기존 데이터베이스는 컬럼과 컬럼간의 연산, 비교, 조인 집합에 대한 집계 등은 쉬웠으나,

행과 행간의 관계를 정의하거나 비교, 연산하는 것을 하나의 SQL문으로 처리하는 건 어려웠다.

그래서 윈도우 함수가 등장해서 부분적으로 해결이 되었다.

select window_function (arguments) OVER ([partition by 컬럼] [order by 절] [windowing절])

from 테이블명 ;

* 윈도우 함수에는 'over' 가 반드시 들어감

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
1. 그릅 내 순위 함수 (RANK(), ROW_NUMBER())
SELECT JOB, ENAME, SAL,
       RANK() OVER (ORDER BY SAL DESC) ALL_RANK
       RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK
FROM EMP;
// PARTITION BY JOB 은 직업별로 순위를 매긴다는 표현.
// RANK는 공동 순위를 인정함 공동2등이 2명이면 1등 2등 2등 4등 이런식.
 
SELECT JOB, ENAME, SAL,
       RANK() OVER (ORDER BY SAL DESC) RANK
       DENSE_RANK() OVER (ORDER BY SAL DESC) DENSE_RANK
FROM EMP;
 
// DENS_RANK는 공동 2등이 2명이면 1등 2등 2등 3등 이런식.
// 즉, 공동순위를 인정하나 그 다음 등수를 하나만 증가함.
 
SELECT JOB, ENAME, SAL,
       RANK() OVER (ORDER BY SAL DESC) RANK
       ROW_NUMBER() OVER (ORDER BY SAL DESC) ROW_NUMBER
FROM EMP;
// ROW_NUMBER는 공동순위를 인정하지 않음. 즉 공동2위여도 칼럼 정렬상으로
// 1등 [2등, 3등] 4등을 매김.
 
2. 일반 집계 함수
SELECT MGR, ENAME, SAL, SUM(SAL) OVER (PARTITION BY MGR) MGR_SUM
FROM EMP;
// 사원테이블에서 같은 매니저를 두고있는 사원들의 급여의 합계
 
SELECT MGR, ENAME, HIREDATE, SAL MIN(SAL) OVER(PARTITION BY MGR BY HIREDATE) AS MGR_MIN
FROM EMP;
// 사원테이블에서 같은 매니저를 두고있는 사원들중 급여의 최소값 출력( 정렬 )
 
SELECT ENAME, SAL, COUNT(*) OVER( ORDER BY SAL RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS SIM_CNT
FROM EMP;
// * RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING = 컬럼에서 -50 에서 +150 범위내의 포함된 모든 행
// 즉 본인의 급여보다 -50 에서 +150 사이에 있는 사람이 몇명인지 센 출력
 
3. 그룹 내 행 순서 함수
FIRST_VALUE 함수
: 파티션별 윈도우에서 가장 먼저 나온 값을 구한다.
SELECT DEPTNO, ENAME, SAL, FIRST_VALUE(ENAME) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC
       ROWS UNBOUNDED PRECEDING) AS DEPT_RICH
FROM EMP;
// 사원테이블에서 부서별로 급여가 높은 순으로 정렬하고 그중 가장 먼저나온값 즉 최고 연봉자 이름 출력
 
LAST_VALUE함수
: 파티션별 가장 나중에 나온 값 구함. 반대라고 생각.
 
LAG 함수
파티션별 윈도우에서 이전 몇번째 행의 값을 가져올수 있다.
SELECT ENAME, HIREDATE, SAL, LAG(SAL) OVER (ORDER BY HIREDATE) AS PREV_SAL
FROM EMP
WHERE JOB = 'SALESMAN';
// 디폴트는 1이라 이전 사람 급여를 가져오는 결과임.
// LAG(SAL, 20) : 두번째인자는 몇 번째 이전 값인지 즉 2번째 이전 값, 세번째 인자는 없을때 뭐출력할건지 결정 즉 0
LEAD함수 LAG반대, 이후 몇번째 행의 값을 가져올수 있다.
 
4. 그룹 내 비율 함수
RATIO_TO_REPORT 함수 : 파티션 내 전체 컬럼값에 대한 행별 칼럼 값의 백분율을 소수점으로 구함 0<X<=1 범위를 가진다.
각 RATIO값의 합은 1
SELECT ENAME, SAL, ROUND(RATIO_TO_REPORT(SAL) OVER (),2) AS r_r
FROM EMP
WHERE JOB = 'SALESMAN';
// 전체중에 자기 급여의 비율이 나옴 EX) 0.29 , 0.22 등
 
PERCENT_RANK 함수 : 파티션별 윈도우에서 가장 먼저나온  것을 0으로, 마지막을 1로 값이 아닌 행의 순서별 백분율을 구함.누적.
 
CUME_DIST 함수 : 누적 순서상 몇번째 위치인지... 
 
NTILE 함수 : 파티션별 ㅓㄴ체 건수를 ARGUMENT 값으로 N등분한 결과를 구할 수 있음


윈도우 함수로 레코드간의 처리가 가능하다는 점.

사용법과 RANK(), DENSE_RANK(), ROW_NUMBER()의 차이점 반드시 구분할 수 있어야함.

반응형

'DB > SQLD' 카테고리의 다른 글

SQL 활용 - DCL  (0) 2017.09.10
26회 SQLD/SQL개발자 시험 후기, 공부법  (0) 2017.09.09
SQL 활용 - 그룹 함수 (ROLLUP, CUBE)  (0) 2017.09.09
SQL 활용 - 서브 쿼리  (0) 2017.09.08
SQL 활용 - 계층형 질의  (0) 2017.09.08