1. 핵심 원리
ROW_NUMBER 함수는 SQL에서 각 행에 고유한 순번을 부여하는 윈도우 함수입니다. 이 함수는 OVER
절 내에서 지정한 정렬 순서에 따라 행 번호를 매기며, 동일한 값이 있더라도 각각 고유한 순번을 부여합니다.
2. 실무에서 쓰이는 이유
실무에서 ROW_NUMBER
함수는 다음과 같은 이유로 사용됩니다:
- 데이터 순서 지정: 데이터에 순번을 부여하여 특정 기준에 따른 정렬 결과를 나타낼 수 있습니다.
- 페이지네이션: 큰 데이터셋을 페이지 단위로 나눠서 조회할 때 각 페이지의 순번을 매기기 위해 사용됩니다.
- 중복 제거: 중복된 데이터를 순번을 통해 식별하고 제거할 때 유용합니다.
3. 실무에서 구체적으로 사용되는 상황
ROW_NUMBER
함수는 다음과 같은 상황에서 자주 사용됩니다:
- 고객 순위: 고객의 구매 금액을 기준으로 순위를 매겨 고객별 성과를 평가할 때.
- 매출 순위: 제품의 판매량에 따라 순위를 매겨 인기 제품을 분석할 때.
예상 상황 예측:
- 예시 1: 각 고객이 특정 기간 동안 발생시킨 매출에 따라 순위를 매겨 VIP 고객을 선정.
- 예시 2: 각 제품의 월별 판매량에 따라 순위를 매겨 베스트셀러를 분석.
4. 자주 사용되는 윈도우 방식 및 설명
ROW_NUMBER
함수는 다음과 같은 윈도우 방식과 함께 사용됩니다:
OVER (ORDER BY column)
- 설명: 지정한 열의 값에 따라 행에 고유한 순번을 매깁니다.
- 사용 예시:
sql SELECT empno, ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) AS 번호 FROM emp WHERE deptno = 20;
OVER (PARTITION BY column ORDER BY column)
- 설명: 특정 열을 기준으로 데이터 그룹을 나누고, 각 그룹 내에서 순번을 매깁니다.
- 사용 예시:
sql SELECT deptno, ename, sal, ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) AS 번호 FROM emp;
5. 연습 문제
문제 1:
다음의 테이블에서 직원의 급여에 따라 순위를 매기는 SQL 쿼리를 작성하시오.
- 테이블:
employee
- 열:
empno
,ename
,salary
문제 2:
부서별로 직원의 급여에 따라 순위를 매기는 SQL 쿼리를 작성하시오.
- 테이블:
employee
- 열:
deptno
,empno
,salary
6. 연습 문제 해답
해답 1:
SELECT empno, ename, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS 순위
FROM employee;
해답 2:
SELECT deptno, empno, ename, salary,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY salary DESC) AS 부서별순위
FROM employee;
7. 응용 문제
문제 1:
각 제품의 판매량에 따라 순위를 매기는 SQL 쿼리를 작성하시오.
- 테이블:
product_sales
- 열:
product_id
,product_name
,sales
문제 2:
각 지역별로 지점의 매출에 따라 순위를 매기는 SQL 쿼리를 작성하시오.
- 테이블:
branch_sales
- 열:
region
,branch_id
,revenue
8. 응용 문제 해답
해답 1:
SELECT product_id, product_name, sales,
ROW_NUMBER() OVER (ORDER BY sales DESC) AS 판매순위
FROM product_sales;
해답 2:
SELECT region, branch_id, revenue,
ROW_NUMBER() OVER (PARTITION BY region ORDER BY revenue DESC) AS 지역별순위
FROM branch_sales;
9. 전자상거래 업계에서의 사용 예시
사용될 수 있는 경우 예측:
- 베스트셀러 분석: 각 제품의 판매량에 따라 순위를 매겨 인기 상품을 선정할 때.
- 고객 기여도 분석: 각 고객의 구매 금액에 따라 순위를 매겨 VIP 고객을 분석할 때.
예상 상황 문제:
- 각 상품의 월별 판매량에 따라 순위를 매기는 SQL 쿼리를 작성하시오.
- 각 고객의 연간 구매 금액에 따라 순위를 매기는 SQL 쿼리를 작성하시오.
SQL 코드 및 시각적 예시
문제 1 SQL 코드:
SELECT product_id, month, sales,
ROW_NUMBER() OVER (PARTITION BY month ORDER BY sales DESC) AS 월별판매순위
FROM monthly_sales;
예시 테이블:
product_id | month | sales | 월별판매순위 |
---|---|---|---|
101 | Jan | 1000 | 1 |
102 | Jan | 800 | 2 |
101 | Feb | 1200 | 1 |
102 | Feb | 1000 | 2 |
문제 2 SQL 코드:
SELECT customer_id, year, total_spent,
ROW_NUMBER() OVER (PARTITION BY year ORDER BY total_spent DESC) AS 연간구매순위
FROM customer_spending;
예시 테이블:
customer_id | year | total_spent | 연간구매순위 |
---|---|---|---|
001 | 2023 | 5000 | 1 |
002 | 2023 | 4500 | 2 |
001 | 2024 | 6000 | 1 |
002 | 2024 | 5500 | 2 |