이제 진짜 예시로 들어가서, 실제 문제에서 이게 어떻게 돌아가는지 직접 볼 준비 됐지?
예시: 지역별 판매 랭킹 계산
가령 sales 테이블이 있고, 여기엔 여러 지역의 판매 데이터가 들어있다고 해보자. 각 지역별로 판매 랭킹을 구해야 해.
| id | region | sales_amount |
|---|---|---|
| 1 | North | 5000 |
| 2 | North | 3000 |
| 3 | North | 7000 |
| 4 | South | 2000 |
| 5 | South | 4000 |
| 6 | East | 8000 |
| 7 | East | 6000 |
문제: 각 지역별로 판매 랭크(RANK) 구하기
SELECT
region,
sales_amount,
RANK() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS sales_rank
FROM
sales;
결과:
| region | sales_amount | sales_rank |
|---|---|---|
| North | 7000 | 1 |
| North | 5000 | 2 |
| North | 3000 | 3 |
| South | 4000 | 1 |
| South | 2000 | 2 |
| East | 8000 | 1 |
| East | 6000 | 2 |
여기서 PARTITION BY region을 써서 각 지역별로 따로 랭크를 계산한 거야. 만약 PARTITION BY 없이 하면, 테이블 전체에서 랭크가 매겨져.
예시: 누적 수입 합계 계산
이번엔 transactions 테이블을 가지고, 각 고객별로 누적(=누계) 수입 합계를 구해보자.
| id | customer_id | purchase_date | amount |
|---|---|---|---|
| 1 | 101 | 2023-01-01 | 100 |
| 2 | 101 | 2023-01-03 | 50 |
| 3 | 102 | 2023-01-02 | 200 |
| 4 | 101 | 2023-01-05 | 150 |
| 5 | 102 | 2023-01-04 | 100 |
문제: 각 고객별로 누적 합계 구하기
SELECT
customer_id,
purchase_date,
amount,
SUM(amount) OVER (PARTITION BY customer_id ORDER BY purchase_date) AS cumulative_sum
FROM
transactions;
결과:
| customer_id | purchase_date | amount | cumulative_sum |
|---|---|---|---|
| 101 | 2023-01-01 | 100 | 100 |
| 101 | 2023-01-03 | 50 | 150 |
| 101 | 2023-01-05 | 150 | 300 |
| 102 | 2023-01-02 | 200 | 200 |
| 102 | 2023-01-04 | 100 | 300 |
여기서 핵심은 OVER() 안에 ORDER BY purchase_date를 써서, 누적 합계가 시간 순서대로 계산된다는 거야.
예시: 데이터 분위수로 나누기
이번엔 students 테이블이 있다고 치고, 이름이랑 시험 점수가 들어있어. 학생들을 점수로 4개 그룹으로 나누고 싶어.
| id | name | test_score |
|---|---|---|
| 1 | Alice | 85 |
| 2 | Bob | 95 |
| 3 | Charlie | 75 |
| 4 | Diana | 88 |
| 5 | Edward | 65 |
| 6 | Fiona | 70 |
문제: NTILE()로 학생들을 4개 그룹으로 나누기
SELECT
name,
test_score,
NTILE(4) OVER (ORDER BY test_score DESC) AS quartile
FROM
students;
쿼리 결과는 이렇게 나와:
| name | test_score | quartile |
|---|---|---|
| Bob | 95 | 1 |
| Diana | 88 | 1 |
| Alice | 85 | 2 |
| Charlie | 75 | 3 |
| Fiona | 70 | 3 |
| Edward | 65 | 4 |
NTILE(4)는 데이터를 4개 그룹으로 쪼개. 점수가 높은 학생들이 1그룹, 낮은 학생들은 마지막 그룹에 들어가.
예시: 시계열 데이터 분석
site_visits 테이블엔 사이트별로 날짜별 방문자 수가 들어있어. 각 사이트별로 날짜별 방문자 수 차이를 계산해야 해.
| site_id | visit_date | visits |
|---|---|---|
| 1 | 2023-01-01 | 100 |
| 1 | 2023-01-02 | 120 |
| 1 | 2023-01-03 | 110 |
| 2 | 2023-01-01 | 50 |
| 2 | 2023-01-02 | 60 |
| 2 | 2023-01-03 | 70 |
우리 문제 — 날짜별 방문자 수 차이 계산하기
SELECT
site_id,
visit_date,
visits,
visits - LAG(visits) OVER (PARTITION BY site_id ORDER BY visit_date) AS visit_diff
FROM
site_visits;
결과:
| site_id | visit_date | visits | visit_diff |
|---|---|---|---|
| 1 | 2023-01-01 | 100 | NULL |
| 1 | 2023-01-02 | 120 | 20 |
| 1 | 2023-01-03 | 110 | -10 |
| 2 | 2023-01-01 | 50 | NULL |
| 2 | 2023-01-02 | 60 | 10 |
| 2 | 2023-01-03 | 70 | 10 |
LAG() 함수는 바로 전 행의 값을 가져와. 만약 이전 행이 없으면 결과는 NULL이야. 이 함수에 대해서는 다음 강의에서 더 자세히 알려줄게 :P
GO TO FULL VERSION