window_function(argument)
OVER (PARTITION BY 그룹 기준 컬럼 ORDER BY 정렬 기준)
SUM, AVG, RANK 등)SELECT 학생이름, 반, 점수,
RANK() OVER (PARTITION BY 반 ORDER BY 점수 DESC) AS 순위
FROM 성적표;
SELECT 음식점, 매출액,
매출액 / SUM(매출액) OVER (PARTITION BY 음식종류) * 100 AS 매출비율
FROM 음식점매출;
SELECT 음식점, 매출액,
SUM(매출액) OVER (PARTITION BY 음식종류 ORDER BY 매출액) AS 누적매출
FROM 음식점매출;
SELECT 음식종류, 음식점,
RANK() OVER (PARTITION BY 음식종류 ORDER BY 주문건수 DESC) AS 순위,
주문건수
FROM (SELECT 음식종류, 음식점, COUNT(*) 주문건수
FROM 음식점주문
GROUP BY 음식종류, 음식점) t
WHERE 순위 <= 3
ORDER BY 음식종류, 순위;
이렇게 열심히 풀어 설명해도,,, 해보지 않으면 절대 모른다

그래서 예제도 준비했다. 푸는데 좀 시간이 걸릴 것이니 여유 있는 날 심심풀이 땅콩으로 풀길 바란다.
문제:
온라인 쇼핑몰에서 고객들이 주문한 데이터가 아래와 같이 있다고 가정해보자. 각 고객이 얼마나 많이 주문했는지 순위를 매기고, 각 고객의 누적 주문 금액도 계산해보자.
| customer_id | order_amount |
|---|---|
| C001 | 10000 |
| C002 | 15000 |
| C003 | 20000 |
| C004 | 12000 |
| C005 | 18000 |
| C001 | 30000 |
| C002 | 25000 |
| C003 | 10000 |
| C004 | 20000 |
| C005 | 15000 |
| customer_id | total_amount | rank | cumulative_amount |
|---|---|---|---|
| C003 | 30000 | 1 | 30000 |
| C005 | 33000 | 2 | 63000 |
| C002 | 40000 | 3 | 103000 |
| C001 | 40000 | 3 | 143000 |
| C004 | 32000 | 5 | 175000 |
이 문제를 풀기 위해서는 SUM(), RANK()와 같은 윈도우 함수를 사용 해야함.
-- 1. 각 고객의 총 주문 금액 계산
SELECT
customer_id,
SUM(order_amount) AS total_amount
FROM order_history
GROUP BY customer_id;
-- 2. 총 주문 금액에 따른 순위 계산
SELECT
customer_id,
total_amount,
RANK() OVER (ORDER BY total_amount DESC) AS rank
FROM (
SELECT
customer_id,
SUM(order_amount) AS total_amount
FROM order_history
GROUP BY customer_id
) a;
-- 3. 누적 주문 금액 계산
SELECT
customer_id,
total_amount,
RANK() OVER (ORDER BY total_amount DESC) AS rank,
SUM(total_amount) OVER (ORDER BY total_amount DESC) AS cumulative_amount
FROM (
SELECT
customer_id,
SUM(order_amount) AS total_amount
FROM order_history
GROUP BY customer_id
) b
ORDER BY cumulative_amount;
| customer_id | total_amount | rank | cumulative_amount |
|---|---|---|---|
| C003 | 30000 | 1 | 30000 |
| C005 | 33000 | 2 | 63000 |
| C002 | 40000 | 3 | 103000 |
| C001 | 40000 | 3 | 143000 |
| C004 | 32000 | 5 | 175000 |