본문 바로가기
일일퀘스트 일일퀘스트

SQLD 시험 문제: 윈도우 함수(Window Function) 구문과 순위 산정

ace 읽는 시간 약 8분

윈도우 함수란 무엇인가

데이터베이스를 다루다 보면 단순히 데이터를 조회하는 것을 넘어, 데이터들 사이의 관계를 분석해야 할 때가 많습니다. 예를 들어, 전체 매출 데이터에서 각 부서별로 매출 순위를 매기거나, 전일 대비 오늘 매출의 증감률을 계산하는 작업이 대표적입니다. 이때 사용하는 강력한 도구가 바로 윈도우 함수(Window Function)입니다. SQLD 시험에서도 단골로 출제되는 핵심 개념이며, 실무에서는 데이터 분석의 생산성을 비약적으로 높여주는 필수 기술입니다.

윈도우 함수는 행과 행 사이의 관계를 정의하기 위해 제공되는 함수입니다. 일반적인 집계 함수(SUM, AVG, COUNT 등)는 여러 행을 하나로 묶어 결과값 하나를 반환하지만, 윈도우 함수는 결과 행의 개수를 줄이지 않으면서 각 행마다 계산된 값을 보여줍니다. 즉, 전체 데이터를 유지하면서 그 옆에 분석 결과를 덧붙이는 방식이라고 이해하면 쉽습니다.

윈도우 함수의 기본 구문 이해하기

윈도우 함수의 구문은 처음 접하면 다소 복잡해 보일 수 있지만, 논리적인 구조를 파악하면 매우 직관적입니다. 기본적인 형태는 다음과 같습니다.

함수명(인자) OVER (PARTITION BY 컬럼 ORDER BY 컬럼 ROWS/RANGE 절)

  • 함수명: 순위를 매기는 RANK, 누적 합계를 구하는 SUM, 이전 행의 값을 가져오는 LAG 등이 있습니다.
  • PARTITION BY: 데이터를 그룹화하는 기준입니다. 이 절을 생략하면 전체 데이터를 하나의 그룹으로 봅니다.
  • ORDER BY: 그룹 내에서 데이터의 정렬 순서를 결정합니다. 순위 함수에서는 필수적인 요소입니다.
  • ROWS/RANGE: 윈도우의 범위를 지정합니다. 현재 행을 기준으로 어디부터 어디까지를 계산에 포함할지 정합니다.

순위 산정 함수의 종류와 특성

SQLD 시험에서 가장 자주 다루는 것은 순위를 매기는 함수들입니다. 이들은 비슷해 보이지만 결과값에서 미묘한 차이가 있으므로 반드시 구분해서 암기해야 합니다.

    • RANK: 동일한 값에는 동일한 순위를 부여합니다. 하지만 다음 순위는 건너뜁니다. (예: 1등, 2등, 2등, 4등)
    • DENSE_RANK: 동일한 값에는 동일한 순위를 부여합니다. 다음 순위는 건너뛰지 않습니다. (예: 1등, 2등, 2등, 3등)
    • ROW_NUMBER: 동일한 값이라도 고유한 번호를 부여합니다. 순위라기보다는 행의 순서에 가깝습니다. (예: 1등, 2등, 3등, 4등)

실무 사례를 통한 비교

여러분이 쇼핑몰의 데이터베이스 관리자라고 가정해 봅시다. 상품별 판매 순위를 매길 때, 매출액이 똑같은 상품이 있다면 어떻게 처리해야 할까요? ‘공동 1위’를 인정하고 싶다면 RANK를, 1위 다음은 무조건 2위로 이어지길 원한다면 DENSE_RANK를 사용합니다. 단순히 데이터 페이지네이션을 위해 고유한 번호가 필요하다면 ROW_NUMBER가 적합합니다.

윈도우 함수 활용을 위한 유용한 팁

윈도우 함수를 효과적으로 활용하기 위해서는 몇 가지 실전 노하우를 알아두는 것이 좋습니다.

    • PARTITION BY의 활용: 전체 데이터가 아닌 부서별, 지역별, 상품 카테고리별로 통계를 내고 싶을 때 반드시 사용해야 합니다.
    • ORDER BY와 순위의 관계: 순위 함수는 정렬 기준이 무엇이냐에 따라 결과가 완전히 달라집니다. 내림차순(DESC)을 사용할지 오름차순(ASC)을 사용할지 명확히 정의해야 합니다.
    • 성능 문제 고려: 윈도우 함수는 연산량이 많을 수 있습니다. 대용량 데이터셋에서 사용할 때는 인덱스 설계와 쿼리 튜닝이 병행되어야 합니다.
    • 서브쿼리 최소화: 윈도우 함수를 사용하면 기존에 서브쿼리를 복잡하게 작성해야 했던 문제를 한 번의 쿼리로 해결할 수 있습니다. 가독성이 좋아지고 유지보수가 쉬워집니다.

흔한 오해와 사실 관계

많은 초보자가 윈도우 함수에 대해 가지는 오해 중 하나는 “WHERE 절에서 사용할 수 있다”는 점입니다. 하지만 SQL 표준상 윈도우 함수는 SELECT 절이나 ORDER BY 절에서만 사용 가능합니다. WHERE 절에서 특정 순위의 데이터만 필터링하고 싶다면, 해당 윈도우 함수를 서브쿼리로 감싼 뒤 외부 쿼리의 WHERE 절에서 조건을 걸어야 합니다.

또 다른 오해는 윈도우 함수가 항상 데이터를 정렬한다는 점입니다. ORDER BY 절이 포함되어 있으면 정렬이 수행되지만, 윈도우 함수 자체는 데이터의 물리적인 정렬을 보장하는 것이 아니라 계산의 순서를 결정하는 것임을 명심해야 합니다.

전문가의 조언

데이터 분석 전문가들은 윈도우 함수를 단순히 시험을 위한 지식으로 치부하지 말라고 강조합니다. 실무에서 데이터의 흐름을 파악하는 것은 비즈니스 의사결정의 핵심이기 때문입니다. “오늘 매출이 어제보다 얼마나 올랐는가?”, “우리 팀 내에서 이 직원의 성과 위치는 어디인가?”와 같은 질문에 답하기 위해 윈도우 함수는 가장 빠르고 정확한 해답을 줍니다.

SQLD 시험을 준비한다면 이론적인 구문 암기에서 멈추지 말고, 직접 다양한 데이터를 생성하여 함수 결과를 확인해보는 실습을 병행하세요. 눈으로 읽는 것과 직접 쿼리를 작성하여 에러를 수정해보는 경험은 시험 당일 문제 풀이 속도와 정확도에서 큰 차이를 만듭니다.

자주 묻는 질문과 답변

질문: RANK 함수와 ROW_NUMBER 함수는 언제 구분해서 써야 하나요?

답변: 데이터의 값이 같을 때 ‘공동 순위’를 인정할지 여부에 따라 결정합니다. 동일한 매출액을 가진 두 상품을 똑같은 대우를 해줘야 한다면 RANK를, 데이터의 중복과 관계없이 순차적으로 번호를 매겨야 한다면 ROW_NUMBER를 사용합니다.

질문: 윈도우 함수를 사용하면 속도가 느려지지 않나요?

답변: 일반적인 상황에서는 매우 효율적입니다. 하지만 수천만 건 이상의 대용량 테이블에서는 정렬 작업이 부하를 줄 수 있습니다. 이럴 때는 파티션 컬럼에 적절한 인덱스를 생성하여 정렬 비용을 줄이는 것이 중요합니다.

질문: PARTITION BY와 GROUP BY의 차이는 무엇인가요?

답변: GROUP BY는 데이터를 그룹화하여 행의 개수를 줄이지만, PARTITION BY는 데이터를 그룹화하면서도 기존 행의 개수를 유지합니다. 전체 데이터와 분석 결과를 동시에 확인하고 싶을 때는 윈도우 함수를, 단순히 통계 수치만 필요할 때는 GROUP BY를 사용합니다.

비용 효율적인 데이터 분석을 위한 전략

윈도우 함수는 클라우드 기반 데이터 웨어하우스(BigQuery, Snowflake, Redshift 등)에서도 매우 강력하게 지원됩니다. 비용 효율성을 높이기 위해서는 데이터 스캔 범위를 최소화하는 것이 관건입니다. 윈도우 함수를 사용하기 전에 필요한 데이터만 필터링하여 처리하는 습관을 들이세요. 불필요한 전체 테이블 스캔을 줄이는 것만으로도 쿼리 실행 비용과 시간을 대폭 절감할 수 있습니다.

마지막으로, SQLD 시험 준비와 실무 활용은 별개가 아닙니다. 시험을 위해 외운 구문 하나하나가 나중에 대규모 데이터를 다룰 때 여러분의 시간을 아껴주는 도구가 될 것입니다. 윈도우 함수를 자유자재로 다룰 수 있게 되면, 단순히 SQL을 할 줄 아는 사람을 넘어 데이터를 해석하고 비즈니스 가치를 창출하는 데이터 분석가로 한 단계 성장할 수 있습니다.

ace

ace
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

error: Content is protected !!

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.