-
SQL) WINDOW 함수(2) -그룹별 행 순서함수, 그룹별 비율함수SQLD/SQL 기본과 활용 2020. 8. 31. 19:30
# 그룹별 행 순서함수
1. FIRST_VALUE, LAST_VALUE 함수 (SQL Server 지원 안함)
- 파티션별 윈도우에서 가장 먼저 나온 값 리턴
- 같은값에 대해선 윈도우에 먼저나온 데이터가 우선순위로 취급
# FIRST VALUE & LAST VALUE SQL> SELECT DEPTNO, ENAME, SAL ,FIRST_VALUE(ENAME) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC ROWS UNBOUNDED PRECEDING ) AS ENAME_FV ,LAST_VALUE(ENAME) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS ENAME_LV FROM EMP; #실행결과 DEPTNO ENAME SAL ENAME_FV ENAME_LV -------------------------------------------------------------------------------------------------- 10 가자미 5000 가자미 오르막 10 수산화 4000 가자미 오르막 10 오르막 1800 가자미 오르막 20 내리막 4500 내리막(#) --- 윈도우에 먼저 등장한 내리막이 우선순위를 가져감 20 운동화 4500 내리막(#) --- 만약 우선순위를 바꾸고싶으면 별도의 뷰나 ORDER BY절 사용 20 자장면 2500 내리막 볶음밥 20 볶음밥 2000 내리막 볶음밥 30 눈싸움 4000 눈싸움 기싸움 30 기싸움 3000 눈싸움 기싸움
2. LAG 함수 (SQL Server 지원 안함)
- 파티션별 윈도우에서 현재행 기준 이전 몇 번째 행의 값 리턴
- LAG(exp1, arg1, arg2)
# arg1 : 현재행 기준 몇번째 앞의행을 가져올지
# arg2 : 가져온 행이 NULL 값일 경우 arg2 값으로 대체
3. LEAD 함수 (SQL Server 지원 안함)
- 파티션별 윈도우에서 현재행 기준 이후 몇 번째 행의 값 리턴
- LEAD(exp1, arg1, arg2)
# arg1 : 현재행 기준 몇번째 뒤의행을 가져올지
# arg2 : 가져온 행이 NULL 값일 경우 arg2 값으로 대체
# 그룹별 비율함수
1. RATIO_TO_REPORT 함수 (SQL Server 지원 안함)
- 파티션별 칼럼값(속성값)의 비율 (한 파티션의 개별 ratio의 합은 당연히 1이다.)
2. PERCENT_RANK 함수 (SQL Server 지원 안함)
- 파티션별 값이 아닌 행의 순서별 백분율 (동일값은 동일 백분율로 표시, 이후 값은 동일백분율로 표시된값의 갯수와 상관있음)
ex) 0.2 - 0.4 - 0.4 - 0.8 - 1.0 (5개의 데이터중 2,3행이 중복)
3. CUME_DIST 함수 (SQL Server 지원 안함)
- 파티션별 값이 아닌 행의 순서별 백분율 (동일값은 동일 백분율로 표시, 이후 값은 동일백분율로 표시된값의 갯수와 상관있음)
+ (동일값은 동일 백분율로 표시하나, 다른 WINDOW 함수와는 다르게 맨뒤의 행의 결과값을 따른다)
ex) 0.2 - 0.6 - 0.6 - 0.8 - 1.0 (5개의 데이터중 2,3행이 중복)
4. NTILE 함수 (SQL Server 지원 안함)
- NTILE(N) : 파티션별 전체 건수를 N 등분하고, 등분 순서를 리턴
ex) 총 데이터 건수가 20건일때 NTILE(4) 사용시 5등분되며, 5등분의 첫번째 부분은 값이 1부터 시작하여 마지막부분은 5까지 값을 리턴.
# RATIO_TO_REPORT SQL> SELECT ENO, SAL ,ROUND (RATIO_TO_REPORT (SAL) OVER (), 2) AS SAL_RR FROM EMP; # 실행결과 ENO SAL SAL_RR ---------------------------------------- 001 1600 0.29 002 1250 0.22 003 1250 0.22 004 1500 0.27 # PERCENT_RANK SQL> SELECT DEPTNO, SAL ,PERCENT_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) AS PR FROM EMP; # 실행결과 (0.00에서 1.00 까지) DEPTNO SAL PR ------------------------------------------ 10 1600 0.00(#) 10 1600 0.00(#) 10 1250 1.00 20 1500 0.50 20 1200 1.00 # CUME_DIST SQL> SELECT DEPTNO, SAL ,CUME_DIST() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) AS CD FROM EMP; # 실행결과 (0.00에서 1.00 까지) - 동일 값은 마지막행의 리턴값으로 동일처리 DEPTNO SAL CD ------------------------------------------ 10 1600 0.67(#) 10 1600 0.67(#) 10 1250 1.00 20 1500 0.50 20 1200 1.00 # NTILE SQL> SELECT DEPTNO, SAL ,NTILE(3) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) AS NT FROM EMP; # 실행결과 (0.00에서 1.00 까지) - 동일 값은 마지막행의 리턴값으로 동일처리 DEPTNO SAL NT ------------------------------------------- 10 1600 1 10 1630 1 10 1250 2 10 1500 3 =========================================== 20 1220 1 20 1250 2 20 1700 3 =========================================== 30 1400 1 30 1800 2
728x90'SQLD > SQL 기본과 활용' 카테고리의 다른 글
Oracle SQL) 계층형 쿼리와 셀프조인 (0) 2020.09.01 SQL) Top N 쿼리 (0) 2020.09.01 SQL) WINDOW 함수(1) -그룹내 순위함수,일반 집계함수 (0) 2020.08.31 SQL) ROLLUP, CUBE 함수에 대한 이해와 고찰 (0) 2020.08.31 스칼라 서브쿼리(Scalar SubQuery), 인라인 뷰(Inline View), 뷰(View) (0) 2020.08.28