μΌλ° μ§κ³ vs μλμ° ν¨μ
- κ°μ₯ ν° μ°¨μ΄ : νμ΄ μ μ§λλκ°
- μλ³Έ λ°μ΄ν°λ₯Ό μ μ§νλ©΄μ μ§κ³κ°μ ν¨κ» λ³Ό μ μλ€.
-- μΌλ° μ§κ³ : νμ΄ μ€μ΄λ¦
SELECT region, SUM(amount)
FROM orders
GROUP BY region;
κ²°κ³Ό:
ββββββββββ¬βββββββββ
β region β sum β
ββββββββββΌβββββββββ€
β μμΈ β 500000 β
β λΆμ° β 300000 β
ββββββββββ΄βββββββββ
-- μλμ° ν¨μ : νμ΄ μ μ§λ¨
SELECT
order_id,
region,
amount,
SUM(amount) OVER (PARTITION BY region) AS region_total
FROM orders;
κ²°κ³Ό:
ββββββββββββ¬βββββββββ¬βββββββββ¬βββββββββββββββ
β order_id β region β amount β region_total β
ββββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ€
β 1 β μμΈ β 200000 β 500000 β
β 2 β μμΈ β 300000 β 500000 β
β 3 β λΆμ° β 300000 β 300000 β
ββββββββββββ΄βββββββββ΄βββββββββ΄βββββββββββββββ
κΈ°λ³Έ λ¬Έλ²
- PARTITION BYλ κ·Έλ£Ήμ λλκ³ , ORDER BYλ κ·Έλ£Ή μμμ μμλ₯Ό μ νλ€.
ν¨μ() OVER (
PARTITION BY κ·Έλ£Ή κΈ°μ€ μ»¬λΌ -- GROUP BY κ°μ μν
ORDER BY μ λ ¬ κΈ°μ€ μ»¬λΌ -- μμκ° νμν ν¨μμ μ¬μ©
)
ROW_NUMBER - μλ² λ§€κΈ°κΈ°
- κ·Έλ£Ή μμμ μλ²μ λ§€κΈ΄λ€. μ€λ³΅ μμ΄ 1λΆν° μμλλ‘ λΆμ¬λλ€.
SELECT
customer_id,
order_id,
ordered_at,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY ordered_at
) AS order_seq
FROM orders;
κ²°κ³Ό:
βββββββββββββββ¬βββββββββββ¬βββββββββββββ¬ββββββββββββ
β customer_id β order_id β ordered_at β order_seq β
βββββββββββββββΌβββββββββββΌβββββββββββββΌββββββββββββ€
β C1 β 1 β 2024-01-01 β 1 β
β C1 β 5 β 2024-01-15 β 2 β
β C2 β 2 β 2024-01-03 β 1 β
βββββββββββββββ΄βββββββββββ΄βββββββββββββ΄ββββββββββββ
- κ³ κ°μ 첫 λ²μ§Έ μ£Όλ¬Έλ§ μΆμΆ
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY ordered_at
) AS rn
FROM orders
)
SELECT * FROM ranked WHERE rn = 1;
RANK / DENSE_RANK - μμ λ§€κΈ°κΈ°
- RANKλ λμ μ λ€μ μμλ₯Ό 건λλ°κ³ , DENSE_RANKλ 건λλ°μ§ μλλ€.
SELECT
customer_id,
SUM(amount) AS total,
RANK() OVER (ORDER BY SUM(amount) DESC)
DENSE_RANK() OVER (ORDER BY SUM(amount) DESC)
FROM orders
GROUP BY customer_id;
κ²°κ³Ό:
βββββββββββββββ¬βββββββββ¬ββββββ¬ββββββββββββ
β customer_id β total β rnk β dense_rnk β
βββββββββββββββΌβββββββββΌββββββΌββββββββββββ€
β C1 β 500000 β 1 β 1 β
β C2 β 300000 β 2 β 2 β
β C3 β 300000 β 2 β 2 β ← λμ
β C4 β 100000 β 4 β 3 β ← RANKλ 4, DENSE_RANKλ 3
βββββββββββββββ΄βββββββββ΄ββββββ΄ββββββββββββ
LAG / LEAD - μ΄μ / λ€μ ν μ°Έμ‘°
- μκ³μ΄ λ°μ΄ν°μμ μ΄μ κ°μ΄λ λ€μ κ° μ°Έμ‘°ν λ μ΄λ€.
- LEADλ λ°λλ‘ λ€μ νμ μ°Έμ‘°νλ€. μλ₯Ό λ€μ΄ "λ€μ μ£Όλ¬ΈκΉμ§ λ©°μΉ μ΄ κ±Έλ Έλκ°"λ₯Ό κ³μ°ν λ μ΄λ€.
-- μ μ λλΉ λ§€μΆ μ¦κ°
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue,
revenue - LAG(revenue) OVER (ORDER BY month) AS diff
FROM monthly_revenue;
κ²°κ³Ό:
βββββββββ¬ββββββββββ¬βββββββββββββββ¬βββββββββ
β month β revenue β prev_revenue β diff β
βββββββββΌββββββββββΌβββββββββββββββΌβββββββββ€
β 01 β 100000 β NULL β NULL β
β 02 β 120000 β 100000 β 20000 β
β 03 β 110000 β 120000 β -10000 β
βββββββββ΄ββββββββββ΄βββββββββββββββ΄βββββββββ
SUM / AVG OVER - λμ μ§κ³
- ORDER BYλ₯Ό ν¨κ» μ°λ©΄ λμ ν©κ³λ μ΄λ νκ· μ ꡬν μ μλ€.
-- λμ λ§€μΆ
SELECT
ordered_at,
amount,
SUM(amount) OVER (ORDER BY ordered_at) AS cumulative_sum
FROM orders;
κ²°κ³Ό:
ββββββββββββββ¬βββββββββ¬βββββββββββββββββ
β ordered_at β amount β cumulative_sum β
ββββββββββββββΌβββββββββΌβββββββββββββββββ€
β 2024-01-01 β 100000 β 100000 β
β 2024-01-02 β 200000 β 300000 β
β 2024-01-03 β 150000 β 450000 β
ββββββββββββββ΄βββββββββ΄βββββββββββββββββ
SELECT
ordered_at,
amount,
AVG(amount) OVER (
ORDER BY ordered_at
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg_3d
FROM orders;
NTILE - λΆμμ λλκΈ°
- λ°μ΄ν°λ₯Ό Nκ°μ κ·Έλ£ΉμΌλ‘ κ· λ±νκ² λλλ€.
-- κ³ κ°μ λ§€μΆ κΈ°μ€μΌλ‘ 4λΆμλ‘ λλκΈ°
SELECT
customer_id,
total_amount,
NTILE(4) OVER (ORDER BY total_amount DESC) AS quartile
FROM customer_stats;
-- quartile 1 = μμ 25% (VIP)
-- quartile 4 = νμ 25%
μμ
- κ³ κ°λ³ 첫 λ²μ§Έ ꡬ맀 λ μ§λ₯Ό ꡬνμμ€.
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY ordered_at) AS rn
FROM orders
)
SELECT customer_id, ordered_at AS first_order_date
FROM ranked WHERE rn = 1;
- μ μ λλΉ λ§€μΆ μ¦κ°λ₯ μ ꡬνμμ€.
SELECT
month,
revenue,
ROUND(
(revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month) * 100, 2
) AS growth_rate
FROM monthly_revenue;
- μμ 10% κ³ κ°μ μΆμΆνμμ€.
WITH ranked AS (
SELECT customer_id, total_amount,
NTILE(10) OVER (ORDER BY total_amount DESC) AS decile
FROM customer_stats
)
SELECT * FROM ranked WHERE decile = 1;
- 3μΌ μ΄λ νκ· μ ꡬνμμ€.
SELECT
date,
revenue,
AVG(revenue) OVER (
ORDER BY date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg
FROM daily_revenue;
μ 리
- μλμ° ν¨μμ ν΅μ¬μ νμ μ μ§νλ©΄μ μ§κ³νλ€λ κ²μ΄λ€.
| ν¨μ |
μ©λ |
| ROW_NUMBER |
κ·Έλ£Ή λ΄ μλ² (μ€λ³΅ μμ) |
| RANK |
μμ (λμ μ λ€μ μμ 건λλ) |
| DENSE_RANK |
μμ (λμ μ λ€μ μμ μ 건λλ) |
| LAG |
μ΄μ ν κ° μ°Έμ‘° |
| LEAD |
λ€μ ν κ° μ°Έμ‘° |
| SUM/AVG OVER |
λμ ν©κ³/μ΄λ νκ· |
| NTILE |
NλΆμλ‘ κ· λ± λΆν |