콘텐츠로 건너뛰기

[SQL 인터뷰] RANK()와 DENSE_RANK()의 차이

데이터 분석가(Data Analyst) 기술 면접 시 다룰 수 있는 SQL 쿼리 관련 포스팅입니다. 이번에는 순위 함수 중 RANK()와 DENSE_RANK() 함수의 차이에 대해 물어보는 질문에 대해 다뤄보겠습니다.

질문: RANK()와 DENSE_RANK() 함수의 차이를 설명하고, 실제 비즈니스 사례에서 이 두 함수를 어떻게 사용할 수 있는지 예를 들어 설명하세요.

RANK() 함수

RANK() 함수는 각 행의 순위를 반환합니다. 동일한 값을 가진 행은 같은 순위를 가지지만, 그 다음 순위는 건너뜁니다.

RANK() OVER (PARTITION BY partition_column ORDER BY order_column)
  • PARTITION BY partition_column: 데이터를 그룹화할 열 (생략 가능)
  • ORDER BY order_column: 순위를 지정할 열 (필수)

DENSE_RANK() 함수

DENSE_RANK() 함수도 각 행의 순위를 반환하지만, 동일한 값을 가진 행은 같은 순위를 가지며, 그 다음 순위는 연속적으로 부여됩니다.

DENSE_RANK() OVER (PARTITION BY partition_column ORDER BY order_column)
  • PARTITION BY partition_column: 데이터를 그룹화할 열 (생략 가능)
  • ORDER BY order_column: 순위를 지정할 열 (필수)

이 두 함수는 순위 계산에서 자주 사용되며, 데이터 분석에서 매우 유용합니다.

■ 예제: 제품 판매량 순위 분석

한 회사에서 제품의 월별 판매량 데이터를 분석하고 있습니다. 각 제품의 판매량 순위를 구하고, 동일한 판매량을 가진 제품들이 있을 때 RANK()와 DENSE_RANK() 함수의 차이를 확인해보겠습니다.

RANK() 함수 사용 예제:

SELECT 
    product_name,
    sales,
    RANK() OVER (ORDER BY sales DESC) AS rank
FROM 
    dataset.sales;

DENSE_RANK() 함수 사용 예제:

SELECT 
    product_name,
    sales,
    DENSE_RANK() OVER (ORDER BY sales DESC) AS dense_rank
FROM 
    dataset.sales;

product_namesalesrankdense_rank
A10011
B10011
C9032
D8043

이 예제에서:

  • RANK() 함수는 동일한 판매량을 가진 제품들에게 동일한 순위를 부여하고, 다음 순위는 건너뜁니다.
  • DENSE_RANK() 함수는 동일한 판매량을 가진 제품들에게 동일한 순위를 부여하고, 다음 순위는 연속적으로 부여됩니다.

예를 들어, 영업 사원의 월별 판매 실적을 평가하여 인센티브를 지급해야 하는 경우, 실적이 동일한 영업 사원들에게 동일한 순위를 부여하고 다음 순위는 건너뛰어야 합니다. 이 경우는 RANK()가 더 적합합니다.

하지만, 예를 들어, 제품의 인기도를 측정하고자 한다면 동일한 인기도를 가진 제품에 동일한 순위를 부여하고, 다음 순위 역시 연속적으로 부여하고자 할 때는 DENSE_RANK()가 적합하겠죠.

면접 시 다루는 방법

  1. 기본 개념 이해 확인: RANK()와 DENSE_RANK() 함수의 기본 정의와 차이점을 정확히 설명합니다.
  2. 구문 설명: 각 함수의 구문을 설명하고, PARTITION BY와 ORDER BY의 역할을 설명합니다.
  3. 실제 사례 적용: 비즈니스 문제에서 RANK()와 DENSE_RANK() 함수를 사용한 사례를 설명하고, 이를 통해 얻을 수 있는 인사이트를 강조합니다.
  4. 코드 예제: 직접 쿼리 예제를 작성하고, 예상 결과를 설명합니다.
  5. 추가 질문 대비: 왜 RANK()와 DENSE_RANK() 함수가 중요한지, 이 함수들을 사용함으로써 얻을 수 있는 장점과 단점을 설명할 준비를 합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다