본문 바로가기

데이터베이스/SQL 튜닝

[SQL튜닝/인덱스와 조인] 고급 조인 테크닉1 (누적 매출 구하기, 윈도우 함수, ROWS, RANGE, UNBOUNDED PRECEDING/FOLLOWING, CURRENT ROW)

🖥️ 들어가며

📌 Rows와 Range
: Rows는 실제 행의 수를 기준으로, Range는 Order By한 컬럼 값을 기준으로 범위를 지정합니다.

 


✏️ 1. 누적 매출 구하기

  • 기존 쿼리
    • 자체 조인을 사용하여 각 지점의 매월 매출액, 누적 매출액을 함께 표시합니다.
    • T2.판매월 <= T1.판매월 조건으로 현재 월과 이전 월의 데이터를 모두 가져옵니다.
  • 변경 쿼리
    • GROUP BY를 사용하여 결과를 요약합니다.
    • MIN(T1.매출액): 현재 월의 매출액
    • SUM(T2.매출액): 현재 월까지의 누적 매출액
    • 큰 쪽 테이블 T1을 GROUP BY, MIN에서 사용 / 작은 쪽 테이블 T2은 SUM 누적액에서 유일하게 사용합니다. 
  • 윈도우 함수 활용
    • 윈도우 함수(SUM OVER)를 사용하여 누적액을 계산합니다.
    • PARTITION BY 지점: 각 지점별로 별도 누적을 계산합니다.
    • ORDER BY 판매월: 판매월 순서대로 누적을 계산합니다.
    • ROW BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: 첫 행부터 현재 행까지의 범위를 지정합니다.
-- 기존
SELECT   T1.지점, T1.판매월, T1.매출액, T2.판매월, T2.매출액
FROM     누적매출 T1, 누적매출 T2
WHERE    T2.지점 = T1.지점
AND      T2.판매월 <= T1.판매월
ORDER BY T1.지점, T1.판매월, T2.판매월;

-- 변경
SELECT   T1.지점, T1.판매월,
         MIN(T1.매출액) AS 매출액,
         SUM(T2.매출액) AS 누적액
FROM     누적매출 T1, 누적매출 T2
WHERE    T2.지점 = T1.지점
AND      T2.판매월 <= T1.판매월
ORDER BY T1.지점, T1.판매월;

-- 윈도우 함수 활용
SELECT   지점, 판매월, 매출액,
         SUM(매출액) OVER (PARTITION BY 지점 ORDER BY 판매월
                           ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 누적액,
FROM 누적매출;

 

 

✏️ 2. 윈도우 함수

👉🏻 단일행 vs. 다중행 함수 비교

  • 단일행: TO_CHAR, SUB_STRING
  • 다중행: 윈도우 함수, 집계함수 (집계함수 + OVER => 윈도우 함수)

 

  • 윈도우 함수 종류
함수 구분 함수 설명 비고
순위 RANK 순위 1,2,2,4,5
DENSE_RANK 동일 순위 1건으로 산정 1,2,2,3,5
ROW_NUMBER 동일 순위 미인정 1,2,3,4,5
집계 SUM, MAX, MIN, AVG, COUNT 합계, 최대값, 최소값, 평균, 건수  
행순서 FIRST_VALUE, LAST_VALUE 파티션 내의 첫번째 값, 최종값  
LAG, LEAD 이후 레코드의 값, 이전 레코드의 값  
비율 CUME_DIST 파티션 내 데이터 값에 대한 누적 비율 결과값 0~1 사이
PERCENT_RANK 파티션 내 row 개수에 대한 비율
RATO_TO_REPORT 파티션 내 비율
NTILE 인자 값으로 전체 로우 개수를 나누고 인자 값의 순서를 지정 ntile(4) over(order by sal)
sal 컬럼순으로 정렬 → 전체 로우별 4등분 → 1~4 값 설정

 

  • 윈도우 함수 사용법
  • Between 사용 시
rows
  unbounded preceding
(맨 위에서부터)
  current row
  between 10 preceding
(위에서 10개)
and unbounded following
(맨 밑까지)
range   current row   10 following
(밑에서 10개)
(... ORDER BY C1
RANGE BETWEEN 10 PRECEDING AND CURRENT ROW)
-- Order By한 컬럼 값을 기준으로 범위 지정
C1 C2 결과
10 10 10
20 20 10+20
30 30 10+20+30+40
30 40 10+20+30+40

 

 

  • Between 미사용
rows unbounded preceding: 맨 위
  10 preceding: 위에서 10개
range current row: 현재 행까지
  unbounded following: 맨 아래
  10 following: 밑에서 10개

 


 📒 정리하면

  1. 누적 매출 구하기: 기존의 자체 조인 방식, GROUP BY를 활용한 변경 방식, 윈도우 함수를 활용한 방식 중 윈도우 함수 방식이 가장 효율적입니다. (SUM OVER)
  2. 윈도우 함수 종류: 순위(RANK, DENSE_RANK, ROW_NUMBER), 집계(SUM, AVG 등), 행순서(LAG, LEAD 등), 비율(NTILE 등)
  3. 윈도우 함수는 PARTITION BY로 그룹화, ORDER BY로 정렬 순서를 지정할 수 있습니다.
  4. ROWS: 실제 행의 수를 기준 으로 / RANGE: ORDER BY한 컬럼 값을 기준으로 범위를 지정합니다.
  5. UNBOUNDED PRECEDING은 처음부터, CURRENT ROW 현재 행까지, UNBOUNDED FOLLOWING은 마지막까지, n PRECEDING/FOLLOWING: 위에서 n개/밑에서 n개

 

반응형