본문 바로가기
SQL

[SQL] RANK () OVER / ROW_NUMBER () OVER / DENSE()OVER 를 알아보자

by 병든늑대 2022. 1. 3.

순위를 붙여주는 함수는 여러 상황에서 자주 쓰인다.

여러 데이터 중 하나의 데이터만 가져오고 싶을 때, 순위를 매겨서 특정 순위만 가져오면

손쉽게 데이터를 가공할 수 있기 때문이다.

그래서 자주 사용하는 + 안쓰지만 알아두면 좋은 함수를 가져와봤다. 

 

 

1.RANK () OVER

데이터에 순위를 붙여주는 함수이다.

해석하면 mem_no 기준으로 ord_no를 거꾸로 세어줘. 정도이다.

Partition by 값이 같은 것이 있으면 중복 순위가 발생하고, 그 다음 순위는 3등이 된다.

중복 값이 발생하지 않는 상황에서는 쓰기 좋지만, 중복 값이 발생하는 상황에서는 썼다가 데이터가 꼬일 수 있다.

 RANK() OVER(partition BY mem_no order by ord_no desc) as rank
A 1
A 1
A 3
A 4
B 1
C 1

 

 

2. ROW_NUMBER () OVER 

얘도 데이터에 순위를 부여하는 함수이다.

랭크오버와는 다르게 Partition by 값이 중복이어도 중복순위가 발생하지 않는다.

중복 순위가 발생하지 않기 때문에 가장 많이 쓰게 된다.

특정 고객의 가장 최근 접속일을 구할 때, 접속 기록에 순위를 붙여서 1번만 가져와서 쓴다거나 하는 식이다.

Row_number()over (partition BY mem_no order by ord_no asc) as rank
A 1
A 2
A 3
A 4
B 1
C 1

 

3. DENSE () OVER

얘도!! 데이터에 순위를 부여하는 함수이다.

사실 실제로는 한 번도 써본 적이 없다. 그래서 좀 낯설지만 공부를 위해 기록해둔다.

Partition By 값이 중복이면 그 다음 순위는 2등이 된다고 한다. RANK ()NUMBER랑 다른 모양이다.

Dense_rank()over (partition BY a.mem_no order by ord_no desc) as rank
A 1
A 1
A 2
A 3
B 1
C 1

댓글