티스토리 뷰

SQL/SQLD 이론

[SQLD] SQL 활용 : 6절 윈도우함수

개발자 김챠챠 2025. 3. 7. 19:08

6절 윈도우 함수


윈도우 함수(Window Function)

SELECT 윈도우함수(컬럼)
	OVER (PARTITION BY 컬럼 ORDER BY 컬럼 윈도잉절)
FROM 테이블명;

여러 행 간의 관계 정의 함수

SQL의 행간 비교, 순위 매기기, 누적 계산 등을 수행

GROUP BY와는 다르게, 개별 행을 유지하면서 그룹 내 집계를 계산

서브쿼리보다 가독성이 좋고 성능도 우수

윈도우 함수는 OVER() 구문과 함께 사용하며, 중첩 불가능

  • PARTITION BY : 그룹핑 기준
  • ORDER BY : 순위 지정 기준
  • 윈도잉절 : 함수의 대상이 되는 행 범위 지정

윈도우함수의 범위 지정(윈도잉절)

  • BETWEEN A AND B : 구간 지정
  • N PRECEDING, N FOLLOWING : N번째 앞 행, N번째 뒤 행까지 포함
  • UNBOUNDED PRECEDING, UNBOUNDED FOLLOWING : 처음부터/끝까지 포함
  • CURRENT ROW : 현재 행 포함
  • ROWS, RANGE : 행 지정, 값의 범위 지정

순위 함수

SELECT emp_id, name, salary,
       RANK() OVER (ORDER BY salary DESC) AS rank_num,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank_num,
       ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM Employee;

RANK : 중복 순위 포함, 같은 값이면 다음 순위 건너 뜀

DENSE_RANK : 중복 순위 무시

ROW_NUMBER : 단순히 행 번호 표시, 값에 무관하게 고유한 순위 부여

 

일반집계 함수

SELECT emp_id, name, department, salary,
       SUM(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS running_total
FROM Employee;

SUM, MAX, MIN, AVG, COUNT과 같은 집계함수를 개별 행에 유지하면서 계산

 

행 순서 함수

SELECT emp_id, name, salary,
       LAG(salary, 1) OVER (ORDER BY salary DESC) AS prev_salary,
       LEAD(salary, 1) OVER (ORDER BY salary DESC) AS next_salary
FROM Employee;

FIRST_VALUE, LAST_VALUE : 첫 값, 끝 값

LAG, LEAD : 이전 행, 이후 행 (Oracle

LEAD(E,A)E에서 A번째 행의 값을 호출하는 형태로도 쓰임 (A의 기본값은 1)

 

비율 관련 함수

SELECT emp_id, name, salary,
       PERCENT_RANK() OVER (ORDER BY salary DESC) AS percent_rank,
       CUME_DIST() OVER (ORDER BY salary DESC) AS cume_dist
FROM Employee;

PERCENT_RANK() : 백분율 순서 - 순위별 상대적 위치

CUME_DIST() : 현재 행 이하 값을 포함한 누적 백분율

NTILE(A) : 전체 데이터 A등분

RATIO_TO_REPORT : 총합계에 대한 값의 백분율

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
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
글 보관함