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

SQLD 윈도우 함수(Window Function) RANK, ROW_NUMBER 차이와 활용법

ace 읽는 시간 약 7분

SQL 데이터 분석의 핵심 윈도우 함수 이해하기

데이터베이스를 다루다 보면 단순히 데이터를 조회하는 것을 넘어, 특정 그룹 내에서의 순위를 매기거나 데이터의 흐름을 파악해야 하는 상황을 자주 마주하게 됩니다. 이때 가장 강력한 도구가 바로 윈도우 함수입니다. 그중에서도 실무에서 가장 빈번하게 사용되는 RANK와 ROW_NUMBER는 데이터 분석의 기본기이자 필수 역량입니다. 이 두 함수의 차이를 명확히 이해하면 복잡한 쿼리를 훨씬 간결하고 효율적으로 작성할 수 있습니다.

윈도우 함수란 무엇인가

윈도우 함수는 행과 행 사이의 관계를 정의하거나, 특정 범위의 데이터를 집계할 때 사용하는 함수입니다. 일반적인 집계 함수(SUM, AVG 등)가 여러 행을 하나로 합쳐 결과값을 반환하는 것과 달리, 윈도우 함수는 결과 행의 개수를 줄이지 않고 각 행별로 계산된 값을 유지한다는 특징이 있습니다. 이를 통해 전체 데이터의 흐름 속에서 개별 데이터가 가지는 위치나 상대적인 가치를 쉽게 파악할 수 있습니다.

RANK와 ROW_NUMBER의 결정적 차이

이 두 함수는 모두 순번을 매기는 역할을 하지만, 동일한 값을 가진 데이터(동점자)를 처리하는 방식에서 극명한 차이를 보입니다. 실무에서 이 차이를 인지하지 못하면 잘못된 의사결정을 내릴 위험이 있습니다.

RANK 함수의 특징

  • 동일한 값이 존재할 경우 동일한 순위를 부여합니다.
  • 동일한 순위가 발생하면 다음 순위는 건너뜁니다. 예를 들어 1등이 두 명이면 그다음은 3등이 됩니다.
  • 경쟁의 공정성을 고려해야 하는 평가 시스템이나 성적 산출에 주로 사용됩니다.

ROW_NUMBER 함수의 특징

  • 동일한 값이 존재하더라도 각 행에 고유한 번호를 부여합니다.
  • 값의 크기와 상관없이 물리적인 순서에 따라 1부터 순차적으로 숫자를 매깁니다.
  • 데이터의 중복을 제거하거나, 특정 조건에서 상위 N개를 추출하는 작업에 필수적입니다.

순위 함수 비교표

함수 이름 동점자 처리 방식 다음 순위 주요 활용 사례
RANK 동일 순위 부여 건너뜀 (1, 2, 2, 4) 성적 순위, 매출 등급 산정
ROW_NUMBER 고유 번호 부여 순차적 (1, 2, 3, 4) 중복 데이터 제거, 페이지네이션

데이터 분석 실무에서의 활용 방법

데이터를 다룰 때 단순히 순위를 매기는 것을 넘어, 이를 활용해 비즈니스 인사이트를 도출하는 것이 중요합니다. 다음은 실무에서 자주 쓰이는 상황별 적용 전략입니다.

상위 N개 데이터 추출하기

특정 카테고리별로 가장 높은 매출을 올린 상품 3개를 뽑아야 할 때 ROW_NUMBER는 매우 유용합니다. 서브쿼리를 사용하여 먼저 순위를 매긴 뒤, WHERE 절에서 순위가 3 이하인 데이터만 필터링하면 간단하게 해결됩니다. 이는 대규모 데이터셋에서 특정 그룹의 대표값을 추출할 때 가장 성능이 좋은 방식 중 하나입니다.

중복 데이터 제거하기

데이터 수집 과정에서 동일한 고객의 정보가 여러 번 입력되는 경우가 있습니다. 이때 ROW_NUMBER와 PARTITION BY를 조합하면 고객별로 가장 최근에 생성된 행에만 번호를 1로 지정할 수 있습니다. 이후 번호가 1인 데이터만 남기면 중복을 효율적으로 제거할 수 있습니다.

동점자 처리를 통한 공정성 확보

이벤트 당첨자를 선정하거나 성적 우수자를 뽑을 때는 RANK를 사용하는 것이 바람직합니다. 동점자가 발생했을 때 모두에게 동일한 기회를 제공하거나, 혹은 동일한 등급을 부여해야 하는 비즈니스 로직을 구현할 때 RANK가 가진 ‘순위 건너뛰기’ 특성이 핵심적인 역할을 합니다.

흔히 발생하는 오해와 주의사항

많은 초보자가 범하는 실수 중 하나는 RANK와 DENSE_RANK의 차이를 간과하는 것입니다. RANK는 앞서 설명했듯 동점자가 있으면 다음 순위를 건너뛰지만, DENSE_RANK는 순위를 건너뛰지 않고 1, 2, 2, 3과 같이 연속적인 순위를 부여합니다. 만약 순위가 중간에 비는 것을 원치 않는다면 DENSE_RANK를 사용해야 합니다.

또한, 윈도우 함수를 사용할 때는 반드시 ORDER BY 절이 동반되어야 합니다. 어떤 기준으로 순위를 매길지 정의하지 않으면 데이터베이스 엔진은 임의의 순서로 번호를 매기게 되며, 이는 실행할 때마다 결과가 달라지는 심각한 문제를 야기할 수 있습니다. 항상 정렬 기준(ORDER BY)을 명확히 설정하는 습관을 들여야 합니다.

비용 효율적인 쿼리 작성을 위한 조언

데이터베이스의 성능은 쿼리의 효율성에 따라 크게 좌우됩니다. 윈도우 함수는 기본적으로 많은 연산 자원을 소모합니다. 따라서 대용량 테이블에 윈도우 함수를 사용할 때는 다음과 같은 사항을 고려해야 합니다.

  • 필요한 데이터만 먼저 필터링한 후 윈도우 함수를 적용하세요. 전체 데이터를 대상으로 순위를 매기는 것보다 범위를 좁히는 것이 훨씬 빠릅니다.
  • 인덱스를 적절히 활용하세요. PARTITION BY 절에 사용하는 컬럼에 인덱스가 걸려 있다면 쿼리 속도를 획기적으로 높일 수 있습니다.
  • 불필요한 정렬을 최소화하세요. 윈도우 함수 내부의 정렬은 메모리 사용량을 늘립니다. 정렬이 꼭 필요한 컬럼에만 적용하고 중복 정렬은 피하세요.

자주 묻는 질문과 답변

Q: ROW_NUMBER를 사용하여 상위 1건만 뽑고 싶은데 어떻게 하나요?

A: ROW_NUMBER() OVER (PARTITION BY [그룹컬럼] ORDER BY [정렬컬럼] DESC)를 사용하고, 결과값에서 번호가 1인 행만 선택하면 됩니다.

Q: 데이터가 100만 건이 넘는데 RANK를 써도 괜찮을까요?

A: 가능하지만, 정렬 기준이 되는 컬럼에 인덱스가 없다면 성능 저하가 발생할 수 있습니다. 실행 계획을 확인하여 풀 스캔이 일어나는지 먼저 점검하는 것이 좋습니다.

Q: 동점자가 많을 때 RANK 대신 무엇을 쓰면 좋을까요?

A: 동점자에게 모두 동일한 순위를 주되 순위를 건너뛰고 싶지 않다면 DENSE_RANK를, 고유한 순위를 강제로 부여하고 싶다면 ROW_NUMBER를 사용하면 됩니다.

전문가의 시선에서 본 윈도우 함수의 가치

데이터베이스 관리자와 데이터 분석가는 도구의 사용법을 넘어 그 도구가 데이터에 미치는 영향을 이해해야 합니다. 윈도우 함수는 단순히 결과를 보여주는 기능을 넘어, 데이터를 보는 관점을 다각화해 줍니다. 데이터 간의 상대적 위치를 파악하는 것은 비즈니스 의사결정의 질을 높이는 첫걸음입니다.

처음에는 함수 이름이 비슷하여 혼동될 수 있지만, 실습을 통해 데이터를 직접 뽑아보고 그 결과값이 어떻게 달라지는지 눈으로 확인해 보는 과정이 무엇보다 중요합니다. 작은 데이터셋으로 먼저 테스트하고, 점차 복잡한 비즈니스 로직에 적용해 보세요. SQL 실력은 이론 공부보다 직접 쿼리를 짜고 오류를 수정하는 과정에서 비약적으로 발전합니다. 여러분의 데이터 분석 여정에 이 가이드가 작은 이정표가 되기를 바랍니다. 윈도우 함수를 정복함으로써 데이터의 숨겨진 가치를 더 깊이 있게 발견하시길 응원합니다.

ace

ace
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

error: Content is protected !!

광고 차단 알림

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

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