SELECT 윈도우함수(컬럼1) OVER (
[PARTITION BY 컬럼2] -- 그룹화
[ORDER BY 컬럼3 ASC|DESC] -- 정렬
[ROWS|RANGE BETWEEN A AND B] -- 계산 범위
) AS 결과
FROM 테이블;
SELECT
RANK() OVER(ORDER BY ranking_score) AS rank_number,
name,
category,
ranking_score
FROM product;

SELECT
RANK() OVER(PARTITION BY category ORDER BY ranking_score) AS rank_number,
name,
category,
ranking_score
FROM product;

SELECT
DENSE_RANK() OVER(ORDER BY ranking_score DESC) AS dense_rank_number,
name,
category,
ranking_score
FROM product;

SELECT
ROW_NUMBER() OVER(ORDER BY ranking_score) AS row_number,
name,
category,
ranking_score
FROM product;

SELECT
toy_name,
month,
sale_value,
SUM(sale_value) OVER(PARTITION BY toy_name ORDER BY month)
AS total_toy_value
FROM toys_sale;

SELECT
toy_name,
month,
sale_value,
LAG(sale_value) OVER(PARTITION BY toy_name ORDER BY month)
AS prev_month_value,
LAG(sale_value) OVER(PARTITION BY toy_name ORDER BY month) - sale_value
AS difference
FROM toys_sale;

SELECT
toy_name,
month,
sale_value,
LEAD(sale_value) OVER(PARTITION BY toy_name ORDER BY month)
AS next_month_value
FROM toys_sale;

파티션이 없는 경우:

SELECT
IdiotName,
IQ,
PERCENT_RANK() OVER ( ORDER BY IQ ) AS "Percentage Rank"
FROM Idiots;
결과:
+-------------------+------+--------------------+
| IdiotName | IQ | Percentage Rank |
+-------------------+------+--------------------+
| Dumbest | 30 | 0 |
| Homer | 40 | 0.1111111111111111 |
| Patrick Star | 40 | 0.1111111111111111 |
| Ed | 40 | 0.1111111111111111 |
| Dumber | 50 | 0.4444444444444444 |
| Peter Griffin | 50 | 0.4444444444444444 |
| Cosmo | 55 | 0.6666666666666666 |
| Dumb | 60 | 0.7777777777777778 |
| Ralph Wiggum | 65 | 0.8888888888888888 |
| Richard Watterson | 70 | 1 |
+-------------------+------+--------------------+
파티션이 있는 경우:

SELECT
DogName,
Activity,
Score,
PERCENT_RANK() OVER ( PARTITION BY Activity ORDER BY Score ) AS "Percentage Rank"
FROM Dogs;
결과:
+---------+-------------+-------+-----------------+
| DogName | Activity | Score | Percentage Rank |
+---------+-------------+-------+-----------------+
| Bruno | Fetch Stick | 43 | 0 |
| Cooper | Fetch Stick | 67 | 0.5 |
| Max | Fetch Stick | 91 | 1 |
| Bruno | Keep Quiet | 1 | 0 |
| Cooper | Keep Quiet | 8 | 0.5 |
| Max | Keep Quiet | 12 | 1 |
| Bruno | Wag Tail | 51 | 0 |
| Cooper | Wag Tail | 51 | 0 |
| Max | Wag Tail | 87 | 1 |
+---------+-------------+-------+-----------------+


SELECT
고객ID,
결제ID,
결제금액,
AVG(결제금액) OVER (
PARTITION BY 고객ID
ORDER BY 결제ID
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
) AS avg_rec_paid --최근(2가지) 평균 과금액
FROM payments;