특정 구간, 기간이라고 생각하면 됨.
데이터를 조회할 때 통계적인 개념이 들어간다.
- SELECT 구문에서 사용되며 분석 구간을 변동시키는 역할. EX)누적합
- SUM(COLUMN1) OVER(PARTITION BY COLUMN2 ORDER BY COLUMN3)
AS NEW_COLUMN
PARTITION BY : GROUP BY와 비슷한 역할로, 그룹별로 누적 합계를 구할 수 있다. GROUP BY는 집계 결과로 조회가 되는 반면 PARTITION BY는 본래의 TABLE 그대로 출력.
- 생략 가능
ORDER BY : 계산을 하는 순서를 정해준다.- 생략하면 누적 합이 계산되지 않는다
SELECT customernumber, paymentdate, amount,
SUM(amount) OVER(PARTITION BY customernumber
ORDER BY paymentdate) AS total_amount
FROM payments;
SELECT customernumber, paymentdate, amount,
SUM(amount) OVER(PARTITION BY customernumber)
AS total_amount
FROM payments;
SELECT customernumber, paymentdate, amount,
SUM(amount) OVER(ORDER BY paymentdate) AS total_amount
FROM payments;
❔ 문제 1 : orderdetails 테이블에서 각 주문별로 주문된 제품의 평균 수량(quantityOrdered)을 계산하라.
SELECT orderNumber, productCode,
AVG(quantityOrdered) OVER(PARTITION BY orderNumber)
AS AVG_quantity
FROM orderdetails;
❔ 문제 2 : orders 테이블에서 각 고객별로 주문 날짜에 따라서 지금까지의 주문 횟수를 계산하라.
SELECT customerNumber, orderNumber, orderDate,
COUNT(orderNumber) OVER(PARTITION BY customerNumber
ORDER BY orderdate) AS order_count
FROM orders;
LEAD : 다음 행 데이터를 가져온다
LAG : 이전 행 데이터를 가져온다
증가분을 보고싶을 때 많이 사용함
SELECT orderNumber, customerNumber, orderDate,
LAG(orderDate) OVER (PARTITION BY customerNumber ORDER BY orderDate)
AS prev_order_date,
LEAD(orderDate) OVER (PARTITION BY customerNumber ORDER BY orderDate)
AS next_order_date
FROM orders;
SELECT orderNumber, customerNumber, orderDate,
LAG(orderDate) OVER (ORDER BY orderDate) AS prev_order_date,
LEAD(orderDate) OVER (ORDER BY orderDate) AS next_order_date
FROM orders;
SELECT orderNumber, customerNumber, orderDate,
LAG(orderDate) OVER (PARTITION by customerNumber) AS prev_order_date,
LEAD(orderDate) OVER (PARTITION BY customerNumber) AS next_order_date
FROM orders;
❔ 문제 3 : orderdetails 테이블에서 각 제품 코드별로 주문된 수량(orderNumber)을 기준으로 정렬했을 때, 주문 수량의 증분을 계산하라.
SELECT orderNumber, productCode, quantityOrdered,
quantityOrdered - LAG(quantityOrdered) OVER (PARTITION BY productCode ORDER BY orderNumber) AS quantity_difference
FROM orderdetails;