
SQL Window Function (윈도우 함수)
ROW_NUMBER(), RANK(), DENSE_RANK() OVER(PARTITION BY ... ORDER BY ...)
오늘은 SQL 윈도우 함수(Window Function) 중에서 특히 ROW_NUMBER(), RANK(), DENSE_RANK()의 차이점을 집중적으로 학습했다.
이는 단순 집계 함수(SUM(), AVG() 등)와 달리 결과를 그룹별로 나누어 정렬하고, 각 행에 순위를 매기는 함수다.
📊 예시 테이블: 광고 캠페인별 일일 클릭 수
| campaign | date | clicks |
|---|---|---|
| A | 2024-01-01 | 100 |
| A | 2024-01-02 | 100 |
| A | 2024-01-03 | 80 |
| B | 2024-01-01 | 200 |
| B | 2024-01-02 | 150 |
SELECT
campaign,
date,
clicks,
RANK() OVER(PARTITION BY campaign ORDER BY clicks DESC) AS rnk
FROM ads;
이 쿼리는 각 캠페인별로 클릭 수 기준 상위 순위를 매겨준다.
😕 어려웠던 점
RANK()와 DENSE_RANK()의 차이, 그리고 ROW_NUMBER()의 동작 방식이 처음에는 헷갈렸다. RANK()는 순위를 건너뛰고, DENSE_RANK()는 연속된 순위를 준다는 점이 직관적이지 않았다.🔧 해결 방법
ROW_NUMBER()는 동일 값이라도 무조건 고유한 순위를 준다는 점이 확실히 정리되었다.윈도우 함수는 그룹화된 데이터를 행 단위로 분석할 수 있는 유연한 도구라는 점에서 단순 집계 이상의 가치를 가진다.
특히 마케터 입장에서 다음과 같은 활용이 가능함을 깨달았다
✅ 캠페인별 상위 실적 광고 추출
✅ 유저별 첫 방문 이후 재구매까지의 기간 계산
✅ 동일 집단 내에서의 퍼포먼스 비교 분석
기존에는 GROUP BY로만 해결하려 했던 문제들이 있었지만, 윈도우 함수를 쓰면 더 정밀하고 직관적인 분석이 가능하다는 점이 오늘의 가장 큰 배움이었다.
🍀 TOD (Thought of the day)
삶이란 SELECT와 WHERE 사이를 반복하는 여정이다.