728x90
반응형

1. Window 함수

Window 함수는 쿼리에서 OVER() 절과 함께 사용된다. 이 OVER() 절은 함수가 어떻게 적용될지에 대한 범위(윈도우)를 정의한다. 윈도우는 PARTITION BY, ORDER BY 등을 사용하여 특정 그룹이나 순서대로 계산할 수 있게 한다.

2. 기본 구조

<window_function> OVER (PARTITION BY <column> ORDER BY <column>)
  • <window_function>: 집계 함수나 순위 함수 등.
  • PARTITION BY <column>: 데이터를 그룹으로 나누어 계산. 이 부분을 생략하면 전체 테이블을 하나의 그룹으로 간주한다.
  • ORDER BY <column>: 각 파티션 내에서 데이터를 정렬하여 계산.

3. 자주 사용되는 함수

ROW_NUMBER(): 각 행에 대해 순차적인 번호를 매긴다.

SELECT id, ROW_NUMBER() OVER (PARTITION BY id ORDER BY created_at) AS row_num
FROM orders;

PARTITION BY 를 써서 특정 컬럼으로 조건을 정하고 rank를 분리할 수도 있다.

 

RANK(): 순위 번호를 매기고, 동점인 경우 동일 순위를 부여한다.

SELECT id, amount, RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales;

 

DENSE_RANK(): RANK()와 비슷하지만 동점인 경우에도 순위를 건너뛰지 않는다.

SELECT id, amount, DENSE_RANK() OVER (ORDER BY amount DESC) AS dense_rank
FROM sales;

 

NTILE(n): 데이터를 n개의 구간으로 나누어 각 행에 구간 번호를 부여 한다. .

SELECT id, amount, NTILE(4) OVER (ORDER BY amount) AS quartile
FROM sales;

 

SUM(), AVG(), MIN(), MAX() 등 집계 함수: 특정 윈도우 내에서 값을 집계한다.

SELECT id, amount, SUM(amount) OVER (PARTITION BY region ORDER BY date) AS running_total
FROM sales;

4. 예시

판매 데이터에서 지역별로 매출의 누적 합계를 계산하는 예시이다.

SELECT region, amount, 
       SUM(amount) OVER (PARTITION BY region ORDER BY sale_date) AS running_total
FROM sales;
  • PARTITION BY region: 지역별로 데이터를 그룹화한다.
  • ORDER BY sale_date: 각 지역 내에서 날짜별로 정렬하여 누적 합계를 계산한다.

5. ROWS BETWEEN 절

ROWS BETWEEN을 사용하면 윈도우 범위를 더 세밀하게 지정할 수 있다. 예를 들어, 현재 행을 기준으로 이전 3개의 행까지의 데이터를 윈도우로 설정할 수 있다.

SELECT id, amount, 
       SUM(amount) OVER (ORDER BY sale_date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS moving_avg
FROM sales;

ROWS BETWEEN 3 PRECEDING AND CURRENT ROW: 현재 행과 이전 3개의 행을 포함하는 윈도우 범위를 설정한다.

6. 주의사항

  • Window 함수는 집계 함수와는 다르게 GROUP BY와 함께 사용할 수 없다. 대신 PARTITION BY를 사용하여 그룹화한다.
  • 쿼리 성능에 영향을 미칠 수 있으므로 적절한 인덱스와 함께 사용하는 것이 좋다.

 

728x90
반응형

+ Recent posts