15분
"부서별 급여 순위 좀 뽑아줘"
Day 1: 행 순서대로 번호 매기고 싶은데
"부서별 급여 순위 좀 뽑아줘"
SQL 고급 - 윈도우 함수와 성능 최적화 > Day 1: 행 순서대로 번호 매기고 싶은데
학습 목표
윈도우 함수가 필요한 실무 상황을 이해한다 기존 방식의 한계를 체감한다
월요일 아침, 인사팀 요청
"이번 달 성과 평가 때문에 그러는데... 각 부서별로 급여 순위 1~3등 좀 뽑아줄 수 있어? 오늘 중으로 가능할까?"
"네, 금방 해드릴게요."
일단 전체 급여 순위부터 해보자.
에디터 로딩 중...
음, 정렬은 되는데... 순위 번호는 어떻게 붙이지?
첫 번째 시도: 서브쿼리
에디터 로딩 중...
동작은 하는데...
- 느리다: 각 행마다 서브쿼리 실행 (1000명이면 1000번)
- 동점 처리가 이상하다: 같은 급여면 같은 순위가 되어야 하는데?
- 부서별 순위는?: 더 복잡해진다
두 번째 시도: 변수 사용 (MySQL)
에디터 로딩 중...
동작은 하지만...
- 표준 SQL 아님: PostgreSQL, BigQuery에서 안 됨
- 부서별 리셋: 부서가 바뀔 때마다 @rank를 1로?
- 동점 처리: 여전히 복잡
정답은 윈도우 함수
에디터 로딩 중...
한 줄 추가로 끝!
부서별 순위도 간단하다:
에디터 로딩 중...
오늘 배울 것
- 윈도우 함수란: GROUP BY 없이 각 행에 계산 결과 추가
- ROW_NUMBER(): 무조건 1, 2, 3, 4... 순서 번호
- RANK(): 동점이면 같은 순위 (1, 1, 3, 4...)
- DENSE_RANK(): 동점 후에도 연속 (1, 1, 2, 3...)
- PARTITION BY: "부서별", "월별" 그룹 내 순위
이거 알면 "부서별 상위 3명", "월별 매출 순위" 같은 요청이 5분 안에 끝난다.