[Sql] OVER() 함수 (PRECEDING, FOLLOWING 사용))

@hizFin · 2023.02.06 22:00:00 · 2 min read

009 01

OVER() 함수의 기본적인 사용법을 알아보자

OVER() 함수 _ 기본

SELECT A.ENAME
,      A.JOB
,      A.HIREDATE
,      A.SAL
,      SUM(A.SAL)       OVER(ORDER BY A.JOB, A.SAL, A.ENAME)    -- 누적합계(정렬기준에 따라)
,      FIRST_VALUE(SAL) OVER(PARTITION BY A.JOB ORDER BY A.SAL) -- 첫번째 값
,      LAST_VALUE(SAL)  OVER(PARTITION BY A.JOB ORDER BY A.SAL) -- 마지막 값
,      LEAD(SAL)        OVER(PARTITION BY A.JOB ORDER BY A.SAL) -- 다음 row 값
,      LAG(SAL)         OVER(PARTITION BY A.JOB ORDER BY A.SAL) -- 이전 row 값
,      RANK()           OVER(PARTITION BY A.JOB ORDER BY A.SAL) -- RANK
,      DENSE_RANK()     OVER(PARTITION BY A.JOB ORDER BY A.SAL) -- RANK_중복 순위 이후에 순차적 증가  
,      ROW_NUMBER()     OVER(PARTITION BY A.JOB ORDER BY A.SAL) -- ROW_NUMBER
,      CUME_DIST()      OVER(PARTITION BY A.JOB ORDER BY A.SAL) -- 직업별 누적분포(급여순)
,      PERCENT_RANK()   OVER(PARTITION BY A.JOB ORDER BY A.SAL) -- 직업별 백분위(급여순)
,      AVG(CASE WHEN A.SAL > 1000 THEN A.SAL END) OVER(PARTITION BY A.JOB) -- CASE문을 활용한 over()
FROM S_MGA.EMP A
ORDER BY A.JOB, A.SAL, A.ENAME

009 02

PRECEDING, FOLLOWING 사용

PRECEDING, FOLLOWING을 사용하여 range(row 또는 기간)를 설정할 수 있다.

/*
 
회사의 성적이 좋아 새로운 조건들로 급여인상을 진행한다.

조건
CASE1(NEW_SAL_BY_ROW)   : 본인보다 먼저 고용된 인원 2명의 급여를 비교하여 가장 최댓값으로 산정(직업별) 
CASE2(NEW_SAL_BY_MONTH) : 본인보다 24개월 먼저 고용된 인원의 급여를 비교하여 가장 최댓값으로 산정(직업별)

*/

SELECT A.ENAME
,      A.JOB
,      A.HIREDATE
,      A.SAL  -- 기존월급
, MAX(A.SAL) OVER(PARTITION BY A.JOB         -- 직업별
                ORDER       BY A.HIREDATE
                ROWS BETWEEN 2 PRECEDING     -- 이전 2ROW 
                     AND     0 FOLLOWING     -- 이후 0ROW
                ) AS NEW_SAL_BY_ROW          -- BY 본인보다 먼저 고용된 인원 인원급여 이용한 새로운 월급 
, MAX(A.SAL) OVER(PARTITION BY A.JOB         -- 직업별
                ORDER       BY A.HIREDATE 
                RANGE BETWEEN INTERVAL '24' MONTH PRECEDING  -- 24개월 이전 
                      AND     INTERVAL '0'  MONTH FOLLOWING  -- 0개월 이후
                ) AS NEW_SAL_BY_MONTH        -- BY 본인보다 24개월 내 먼저 고용된 인원급여 이용한 새로운 월급  
FROM S_MGA.EMP A
ORDER BY A.JOB, A.HIREDATE

009 03

@hizFin
안녕