Window함수 정리하기
Jun 22, 2023
Contents
윈도우 함수 톺아보기1. 어떻게 생겼어용?
📌 SELECT WINDOW_FUNCTION (ARGUMENTS) OVER([PARTITION BY 컬럼] [ORDER BY 컬럼] [WINDOWING 절])
FROM 테이블명;
- 어떤 함수를 쓸 수 있나요?
집계 함수
AVG() BIT_AND() BIT_OR() BIT_XOR() COUNT() JSON_ARRAYAGG() JSON_OBJECTAGG() MAX() MIN() STDDEV_POP(), STDDEV(), STD() STDDEV_SAMP() SUM() VAR_POP(), VARIANCE() VAR_SAMP()
Window에서만 사용가능한 함수 (순위, 그룹 내 행 순서, 그룹 내 비율)
CUME_DIST() DENSE_RANK() FIRST_VALUE() LAG() LAST_VALUE() LEAD() NTH_VALUE() NTILE() PERCENT_RANK() RANK() ROW_NUMBER()
2. 어떤 케이스에 사용해용?
2.1. 순위 함수
- RANK : ORDER BY를 포함한 쿼리문에서 특정 컬럼의 순위를 구하는 함수
- DENSE_RANK : 동일한 값에 대해서는 같은 순위를 부여하고 중간 순위를 비우지 않음 (ex 1,1,2,3,3,4)
- ROW_NUMBER : 동일한 값에도 고유한 순위를 부여
예시 - 순위 정하기
SELECT val, ROW_NUMBER() OVER (ORDER BY val) AS 'row_number', RANK() OVER (ORDER BY val) AS 'rank', DENSE_RANK() OVER (ORDER BY val) AS 'dense_rank' FROM sample
2.2. 일반 집계 함수
예시 - 누적합 구하기
- Window 함수 사용ver
SELECT SUM(kg) OVER (ORDER BY Line) AS CumSum
- JOIN 활용
- 서브쿼리 ⭐️
2.3. 그룹 내 행 순서 함수
- FIRST_VALUE : 파티션별 윈도우에서 가장 먼저 나온 값을 구함. 공동 등수 인정안함. MIN함수 쓰는 것과 결과 동일
- LAST_VALUE
- LAG
- LEAD
예시 - 데이터 위치 바꾸기
SELECT LAG(Temperature) OVER (ORDER BY RecordDate) AS 'lag', LEAD(Temperature) OVER (ORDER BY RecordDate) AS 'lead' FROM sample # 2칸씩 밀고, null값은 0으로 채워줘 LAG(Temperature, 2, 0)
2.4. 그룹 내 비율 함수
- RATIO_TO_REPORT : 전체 SUM값에 대한 행별 컬럼 값의 백분율을 소수점으로 출력
PERCENT_RANK : 파티션별로 가장 먼저 나오는 값을 0, 가장 마지막에 나오는 값을 1로 해서 행 순서별 백분율 출력
SELECT DEPTNO, ENAME, SAL , PERCENT_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) as P_R FROM EMP; DEPTNO ENAME SAL P_R --------- ---------- ---------- ---------- 10 KING 5000 0 10 CLARK 2450 .5 10 MILLER 1300 1 20 SCOTT 3000 0 20 FORD 3000 0 20 JONES 2975 .5 20 ADAMS 1100 .75 20 SMITH 800 1 30 BLAKE 2850 0 30 ALLEN 1600 .2 30 TURNER 1500 .4 30 MARTIN 1250 .6 30 WARD 1250 .6 30 JAMES 950 1
CUME_DIST : 현재 행보다 작거나 같은 건수에 대한 누적백분율
NTILE : 파티션 별 전체 건수를 등분한 결과 출력
Share article