CodeGym /행동 /SQL SELF /윈도우 함수: SQL의 숨겨진 슈퍼파워

윈도우 함수: SQL의 숨겨진 슈퍼파워

SQL SELF
레벨 29, 레슨 0
사용 가능

처음 보면 SQL에 이미 데이터 분석에 필요한 게 다 있는 것처럼 보여. GROUP BY, 집계 함수, 서브쿼리... 근데 이건 진짜 시작일 뿐이야. 윈도우 함수의 세계에 온 걸 환영해 — 이건 데이터를 한 줄씩 다루면서 전체 컨텍스트를 유지할 수 있는 강력한 도구야.

윈도우 함수는 합계, 평균, 랭킹 등등을 "윈도우" 범위의 행에 대해 계산할 수 있어, 데이터를 집계하지 않고 말이지. 즉, 일반적인 집계 함수(SUM(), AVG(), COUNT())랑 다르게 결과랑 디테일을 각 행에서 다 볼 수 있다는 거지.

예를 들어, 주문별 누적 수익을 계산하고 싶다고 해보자. GROUP BY를 쓰면 개별 주문 정보는 사라지고 합계만 남아. 근데 윈도우 함수를 쓰면 결과를 각 행에 바로 붙일 수 있어서 아무것도 잃지 않아.

윈도우 함수가 특히 좋은 건 데이터를 없애지 않는다는 거야: 각 행은 그대로 있고, 계산 결과만 새로운 컬럼으로 추가돼. 그래서 복잡한 분석도 서브쿼리나 복잡한 구조 없이 한 쿼리 안에서 다 할 수 있어. 이런 함수들은 랭킹, 이동평균 계산, 행 간 값 비교 같은 데 완전 딱이야. 코드도 읽기 쉽고, 결과도 정확하지.

이럴 때 특히 유용해:

  • 직원, 판매자, 상품 랭킹 — 누가 몇 등인지.
  • 시계열 데이터 — 일별, 주별로 어떻게 변했는지.
  • 판매와 재무 — 각 단계별로 얼마나 누적됐는지, 어떤 주문이 평균 이상인지, 누가 상위 25%에 드는지 등.

윈도우 함수가 쓰이는 곳

컨텍스트가 중요할 때, 단순 결과만 필요한 게 아닐 때 어디서든 쓸 수 있어:

  • 판매 리포트;
  • 고객 행동 분석;
  • 누적 지표로 그래프 만들기;
  • 데이터 세그먼트 나누기(예: 사분위수 기준);
  • 편차랑 트렌드 계산.

이건 SQL로 매일 일하는 분석가들한테 진짜 꿀템이야. 실제 예시 몇 개를 보면서 윈도우 함수가 어떻게 구세주가 될 수 있는지 알아보자.

예시 1: 데이터 랭킹

학생 리스트랑 시험 점수가 있다고 해보자. 각 학생한테 반에서 몇 등인지 순위를 주고 싶어. 윈도우 함수면 이거 완전 쉬워. RANK()나 ROW_NUMBER() 같은 함수가 바로 이럴 때 쓰는 거야.

예시 2: 시계열 데이터 분석

회사 수익이 월별로 어떻게 변했는지 보고 싶다고? 누적 수익 합계가 필요하지. 윈도우 함수 SUM()에 윈도우 범위만 지정하면 바로 결과가 나와.

예시 3: 사분위수랑 그룹 나누기

고객을 소득 기준으로 똑같은 그룹으로 나누고 싶어? NTILE() 함수가 도와줄 거야. 누가 상위 25%고, 누가 하위 그룹인지 바로 알 수 있지.

어떻게 생겼냐고?

윈도우 함수는 그냥 결과를 최종 데이터셋에 추가해주는 거야:

SELECT
    student_id,
    grade,
    RANK() OVER (ORDER BY grade DESC) AS rank
FROM 
    students;

이렇게 하면 각 학생마다 점수 기준으로 고유한 랭킹이 붙은 테이블이 나와.

쉬운 비유

친구들이랑 같이 달리기한다고 상상해봐. 각자 자기 속도로 뛰고 있는데, 지금 내가 몇 등인지 알고 싶어. GROUP BY처럼 모두 멈추고 리더보드를 만드는 게 아니라, 그냥 주변을 보면서 내 현재 순위를 바로 알 수 있지.

이게 바로 윈도우 함수야: 달리기를 멈추지 않고, 그룹으로 쪼개지도 않고, 그냥 정보를 추가해주는 거지. 모두 계속 뛰고 있는데, 이제 추가 분석 정보가 생긴 거야 — 예를 들어, 내 앞에 몇 명 있는지, 내 평균 속도가 어떤지 등등.

전통적인 방식보다 좋은 점

클래식한 문제 하나 보자: 판매자별 수익 랭킹 계산. 두 가지 방법이 있어:

  1. 윈도우 함수 없이. 먼저 데이터를 정렬하고, 그 다음에 번호를 붙이려면 서브쿼리나 여러 번 서브쿼리를 써야 해. 길고, 읽기도 힘들지.

  2. 윈도우 함수로. 한 번의 쿼리로 깔끔하고 이해하기 쉬운 문법으로 바로 결과가 나와. 예를 들면:

SELECT
    seller_id,
    revenue,
    RANK() OVER (PARTITION BY region ORDER BY revenue DESC) AS rank_in_region
FROM 
    sales;

이 쿼리는 판매자를 지역별로 나누고, 수익 내림차순으로 랭킹을 매겨줘.

실제 예시

이제 네가 분석가라고 해보자, 판매 데이터를 분석 중이야. 이런 게 궁금할 수 있지:

  • 각 달의 총 수익,
  • 이전 달과 비교해서 수익이 어떻게 변했는지,
  • 지역별로 총 수익 기준 랭킹.

이런 것도 윈도우 함수로, 심지어 한 쿼리 안에서 다 할 수 있어. 근데 이건 다음 강의에서 더 자세히 다룰 거야.

이제 윈도우 함수에 대한 기본 지식을 챙겼으니, 문법이랑 ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE() 같은 함수의 파워를 직접 볼 준비가 된 거야. 다음 강의로 가자!

2
과제
SQL SELF, 레벨 29, 레슨 0
잠금
중첩 종료 조건이 있는 재귀 CTE
중첩 종료 조건이 있는 재귀 CTE
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION