본문 바로가기

SQL

[MySQL] 윈도우 함수 알아보기(Feat: ROW_NUMBER(), RANK(), DENSE_RANK())

본 내용은 [멀티캠퍼스] 데이터 분석&데이터 엔지니어링 취업캠프 28회차에서 실시한 수업 내용 중 일부입니다.

 

윈도우 함수란?

윈도우 함수(Window Function)는 SQL 쿼리에서 사용되는 데이터베이스 함수 중 하나로, 결과 집합 내에서 특정 창 또는 분할된 그룹에 대한 계산을 수행하는 함수이다. 행의 집합에 대한 집계, 순위 지정, 누적 계산 등 다양한 분석 작업을 수행하는 데 사용된다.

 

해당 포스팅에서 알아볼 윈도우 함수는 순위를 부여하는 함수 ROW_NUMBER(), RANK(), DENSE_RANK()이다.

이 3가지 함수는 결과 집합의 각 행에 대한 순위를 계산하는 데에 사용된다. 비슷한 작업을 수행하지만 약간의 차이점이 있다.

 

1. ROW_NUMBER():

  • 정의: ROW_NUMBER() 함수는 각 행에 고유한 순번(순위)를 부여한다.
  • 특징:
    • ROW_NUMBER() 함수는 중복된 값이 있을 경우에도 각 행에 고유한 번호를 부여하며, 순번은 정수로 표현된다.
    • 결과 집합의 각 행에 대한 고유한 식별자가 필요한 경우 주로 사용된다.

 

2. RANK():

  • 정의: RANK() 함수는 결과 집합의 각 행을 순위로 나타낸다. 동일한 값이 있을 경우 동일한 순위를 부여하고, 중복된 값을 건너뜁니다.
  • 특징:
    • RANK() 함수는 동일한 값에 대해서는 동일한 순위를 할당하고, 중복된 값을 가진 행은 그 다음 순위로 건너뛴다.
    • 중복된 값을 가진 행을 건너뛰기 때문에 순위 간격이 커질 수 있다.
    • 순위가 중요한 분석 작업에 사용된다.

 

3. DENSE_RANK():

  • 정의: DENSE_RANK() 함수는 RANK()와 유사하지만 중복된 값에 대해서도 같은 순위를 부여한다.
  • 특징: 
    • DENSE_RANK() 함수는 동일한 값에 대해서는 동일한 순위를 할당하고, 중복된 값을 가진 행은 그 다음 순위로 건너뛰지 않는다.
    • 중복된 값을 가진 행을 건너뛰지 않기 때문에 순위 간격이 크지 않다.
    • 평균 점수 등과 같이 중복된 값을 가지는 경우에 사용된다.

 

ROW_NUMBER(), RANK(), DENSE_RANK()의 공통점과 차이점:

공통점: 모두 결과 집합의 각 행에 대한 순위를 부여하는 함수로 사용된다.

차이점: 

  • ROW_NUMBER(): 각 행에 고유한 순번을 부여하며 중복된 값에 대해서도 고유한 순번을 부여한다.
  • RANK(): 중복된 값에 대해서는 동일한 순위를 부여하고 중복된 값을 건너뛴다.
  • DENSE_RANK(): 중복된 값에 대해서도 동일한 순위를 부여하고 순위 간격이 작다.

 

MySQL 쿼리문 예시:

  • ROW_NUMBER()는 중복된 값에 고유한 순번 부여
  • RANK()는 중복된 값에 동일한 순번을 부여하고 그 다음 순위를 건너뛴다.
  • DENSE_RANK()는 중복된 값에 동일한 순번을 부여하고 그 다음 순위를 건너뛰지 않는다.