이동준1
아웃풋 공부
이동준1
전체 방문자
오늘
어제
  • 분류 전체보기 (84)
    • airflow (8)
    • sql (23)
    • aws (12)
    • python (3)
    • 네트워크 (12)
    • 알고리즘 (2)
    • 짧은서평 (24)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 유연함의힘
  • 고통의 비밀
  • regexp
  • Network
  • 서평
  • 네트워크
  • 퓨처셀프
  • 고통의비밀
  • AWS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
이동준1

아웃풋 공부

sql

[SQL] ROW_NUMBER / RANK / DENSE_RANK

2022. 12. 27. 17:07

ROW_NUMBER, RANK, 그리고 DENSE_RANK는 모두 각 객체의 순위를 표현하는데 나타내는 함수이다. 예를들어, 아래와 같이 학생과 학생의 성적이 담긴 테이블이 있다고 하자. 우리는 여기서 학생들의 순위를 알고 싶다.

NAME SCORE
일동준 97
이동준 76
삼동준 37
사동준 99
오동준 88

 

그럴때는 아래와 같이 쿼리를 작성한다. 각 함수를 써주고, OVER(ORDER BY 정렬기준)을 입력하면 기준에 맞게 정렬된 결과를 출력해준다 (정렬기준 뒤에 DESC를 기입하면 내림차순 기준으로 순위를 매긴다).

SELECT name, score,
	ROW_NUMBER() OVER(ORDER BY score DESC) seq
FROM students
SELECT name, score,
	RANK() OVER(ORDER BY score DESC) seq
FROM students
SELECT name, score,
	DENSE_RANK() OVER(ORDER BY score DESC) seq
FROM students

 

name score seq
사동준 99 1
일동준 97 2
오동준 88 3
이동준 76 4
삼동준 37 5

그러면 위와 같은 출력결과를 내준다. 주어진 상황에서는 세 순위함수 모두 같은 결과를 도출해준다. 이는 중복되는 점수값이 없기 때문이다. 만약 중복값이 존재하게 된다면 세 순위 집계함수는 중복값을 다르게 처리한다. 아래에서 중복값이 존재하는 예시를 살펴보자.

 


1) ROW_NUMBER

ROW_NUMBER은 중복 순위를 무시한다. 정렬 기준값에 중복값이 있더라도, 그냥 순차적으로 순위를 매긴다. 

 

2) RANK 

RANK는 같은 값에 중복 순위를 메긴다. 만약, 중복 순위가 존재한다면 그 다음 순위는 이전의 중복 순위를 고려해서 순위가 메겨진다. 예를들어 시험을 가장 잘본사람의 점수가 98점이고, 그 점수를 받은 사람이 2명이라면 1등은 2명이다. 이 경우에 2등은 존재하지않게 되며, 다음 순위는 3등부터 카운트한다.

 

3) DENSE_RANK

중복 순위를 고려한다는점은 RANK와 동일하다. 그러나 다음 순위를 메길때, 이전의 중복 순위는 고려하지 않는다. 1등이 10명이 존재하더라도, 다음 순위는 2등이다. 함수명대로, 순위를 밀도있게 채워 넣는다고 생각하면 되겠다.

 

 

아래 테이블을 기준으로, 세가지 함수를 모두 사용한다고 가정해보자.

NAME SCORE
가 100
나 100
다 80
라 70

 

ROW_NUMBER

중복순위를 고려하지 않으며, 차례대로 순위를 매긴다.

NAME SCORE seq
가 100 1
나 100 2
다 80 3
라 70 4

 

RANK

중복순위를 허용하며, 다음 순위는 중복순위를 고려해 다음 순위를 메긴다.

NAME SCORE seq
가 100 1
나 100 1
다 80 3
라 70 4

 

DENSE_RANK

중복 순위를 허용하며, 중복순위는 다음번의 순위 부여에 영향을 미치지 않는다.

NAME SCORE seq
가 100 1
나 100 1
다 80 2
라 70 3

 

'sql' 카테고리의 다른 글

[SQL][HackerRank] Binary Tree Nodes  (0) 2023.01.02
[SQL][HackerRank] Occupations  (0) 2022.12.27
[SQL] NESTED CASE  (0) 2022.12.26
[SQL] COUNT()와 NULL  (0) 2022.12.24
[SQL] 조건에 맞는 숫자 탐색  (0) 2022.12.24
    'sql' 카테고리의 다른 글
    • [SQL][HackerRank] Binary Tree Nodes
    • [SQL][HackerRank] Occupations
    • [SQL] NESTED CASE
    • [SQL] COUNT()와 NULL
    이동준1
    이동준1

    티스토리툴바