CodeGym /행동 /SQL SELF /데이터 분석을 위한 윈도우 함수 사용 예시

데이터 분석을 위한 윈도우 함수 사용 예시

SQL SELF
레벨 30, 레슨 1
사용 가능

이제 진짜 예시로 들어가서, 실제 문제에서 이게 어떻게 돌아가는지 직접 볼 준비 됐지?

예시: 지역별 판매 랭킹 계산

가령 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

2
과제
SQL SELF, 레벨 30, 레슨 1
잠금
판매 랭크 계산
판매 랭크 계산
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION