SQL Ranking Window Function

Row_number()

  • Partition 별로 coluumn2 순으로 나열한 후에 Sequence를 생성해준다.
SELECT *, ROW_NUMBER() OVER(PARTITION BY column1 ORDER BY column2 DESC) FROM table

Rank()

  • Row_number()와 비슷하지만, 동일한 값을 가진 경우에 대해서는 동일한 Sequence를 매긴다. 대신 일부 Sequence가 Skip될 수 있다. 예를 들어 Row_number()를 쓸 경우 “1,2,3,4,5,6”으로 나오던 것이 Rank()를 쓰면 “1,2,3,3,5,6”으로 나올 수 있다.
SELECT *, Rank() OVER(PARTITION BY column1 ORDER BY column2 DESC) FROM Table

Dense_Rank()

  • Row_Number()와 Rank()를 섞어놓은 느낌이다. 앞서 예를 들었던 것처럼 Rank()가 “1,2,3,3,5,6”로 나온다면 Dense_Rank()는 “1,2,3,3,4,5”로 나온다.
SELECT *, Dense_Rank() OVER(PARTITION BY column1 ORDER BY column2 DESC) FROM Table

Ntile()

  • Rank(), Dense_Rank(), Row_Number()와는 다르다.Partition 별로 나눈 다음에 Ntile(n)에 있는 n개로 레코드를 나눠준다.SELECT *, Ntile() OVER(PARTITION BY column1 ORDER BY column2 DESC) FROM Table

Percent_Rank()

  • 각 Partition내에서 각 Row 별 Percentile Rank를 생성해준다. 0~1 사이의 값을 Return 해준다.
  • 특정 고객군에서 상위 회원의 비율을 뽑을 때 사용하는 편이다.
SELECT *, PERCENT_RANK() OVER(PARTITION BY column1 ORDER BY column2 DESC) FROM Table

Cume_Dist

  • Percent_Rank()와 유사하다. 하지만 0~1 사이의 값을 Return 하지 않고, Partition내 레코드의 수를 n개라고 할 때 1/n 부터 시작해서 1/n씩 값을 증가하시키면서 1까지의 값을 Return 해준다는 차이가 있다.
SELECT *, Cume_RANK() OVER(PARTITION BY column1 ORDER BY column2 DESC) FROM Table

Reference

  • SQL Ranking Window Function Guide