SELECT
sale_region, sale_date, sale_amount,
SUM(sale_amount) OVER(PARTITION BY sale_region) AS sum_sales
FROM sales;
✔️ 같은 지역에 있는 sale_amount의 누적합
SELECT
sale_region, sale_date, sale_amount,
SUM(sale_amount) OVER(PARTITION BY sale_region ORDER BY sale_amount) AS sum_sales
FROM sales;
✅ MAX 함수를 이용해 파티션별 윈도우의 최댓값을 구할 수 있음.
✔️ 같은 지역에서 sale_amount의 최댓값
SELECT
sale_region, sale_date, sale_amount,
MAX(sale_amount) OVER(PARTITION BY sale_region ) AS max_sales
FROM sales;
✔️ 같은지역에서 sale_amount의 최댓값을 가진 행만 추출
SELECT sale_region, sale_date, sale_amount
FROM (SELECT
sale_region, sale_date, sale_amount,
MAX(sale_amount) OVER(PARTITION BY sale_region ) AS max_sales
FROM sales) AS aa
WHERE sale_amount = max_sales ;
서브쿼리를 사용해서 지역별로 최댓값을 계산한 후 where문을 사용해 지역별 sale_amount가 최댓값인 행만 추출
하지만 위의 예제는 쿼리 성능이 저하될 수 있다.
파티션별 최댓값을 가진 행만 추출할 때는 RANK() 순위 함수를 사용하는게 적절
SELECT sale_region, sale_date, sale_amount
FROM (SELECT
sale_region, sale_date, sale_amount,
RANK() OVER(PARTITION BY sale_region ORDER BY sale_amount DESC ) AS sale_rank
FROM sales) AS aa
WHERE sale_rank = 1 ;
✅ MIN 함수를 이용해 파티션별 윈도우의 최솟값을 구할 수 있음.
✔️ 같은지역에서sale_amount의 최솟값
SELECT
sale_region, sale_date, sale_amount,
MIN(sale_amount) OVER(PARTITION BY sale_region) AS max_sales
FROM sales;
✅ AVG 함수를 이용해 파티션별 윈도우의 평균을 구할 수 있음.
✔️ 같은지역에서sale_amount의 평균
SELECT
sale_region, sale_date, sale_amount,
AVG(sale_amount) OVER(PARTITION BY sale_region) AS avg_sales
FROM sales;
SELECT
customer_id,
COUNT(*) OVER(PARTITION BY customer_id) AS order_count, /* 고객별 주문건수 */
SUM(order_amount) OVER(PARTITION BY customer_id) AS total_amount /*고객별 총주문량*/
FROM orders;
✔️ DISTINCT 문을 사용해서 고객 id의 중복을 없앨 수 있음.
SELECT
DISTINCT customer_id,
COUNT(*) OVER(PARTITION BY customer_id) AS order_count,
SUM(order_amount) OVER(PARTITION BY customer_id) AS total_amount
FROM orders;