본문 바로가기
DB

[postgreSQL] row_number(), rank(), dense_rank(), partition by

by 오렌지마끼야또 2024. 1. 17.
728x90
반응형

 

 

 

 

 

 

row_number() : 1등이 두명이어도 1, 2등으로 나눈다.

rank() : 1등이 두명이면 다음은 3등이다.

dense_rank() : 1등이 두명이면 다음은 2등이다.

 

 

사전 데이터 생성

 

 

 

 

row_number() over()

 

row_number() over() 만 쓴 경우

별로도 partition by 나 order by 를 주지 않았기 때문에 현재 데이터에서 번호만 붙었습니다.

 

 

 

row_number() over(partition by country)

나라별로 partition by를 적용해서 각각 번호가 생성되었습니다.

 

 

 

 

 

row_number() over(partition by country, team)

partition by 를 나라와 팀 두가지로 적용하였습니다. 그래서 먼저 나라로 나누고 그 안에서 팀으로 다시 나누어 순위가 정해졌습니다. 지금은 나라안의 팀이 달라서 모두 1로 나왔습니다. 여기에 만약 동일한 팀을 추가한다면 아래처럼 2가 생깁니다.

 

 

 

row_number() over(partition by country order by birth_year desc)

이번엔 order by 를 주어 나라별로 나이 어린 순으로 순위를 정했습니다.

 

 

 

 

rank() over()

 

rank() over()

order by 로 순서를 주지 않았기 때문에 모든 행이 동일하게 1순위를 가집니다.

 

partition by 만 적용하는 것도 순서만 바뀔 뿐, 동일하게 모두 1순위입니다.

 

 

 

 

rank() over(order by )

출생연도로 order by를 주니 같은 해인 경우 동일한 순위가 주어지고 5를 건너뛰어서 다음 순위를 주었습니다.

차두리와 호나우지뉴, 손흥민과 네이마르가 친구였군요!

 

 

 

 

rank() over(partition by order by)

partition by 를 주어 나라별로 나누고 그 안에서 팀으로 order by를 하였습니다.

 

 

이번엔 나라로 먼저 나누고 그 안에서 다시 팀으로 나눈 후 생년으로 order by를 해보았습니다.

나라 안에서 팀이 하나씩이기때문에 레버쿠젠인 차범근, 차두리 빼고 모두 1순위가 되었습니다.

 

 

 

 

 

 

dense_rank() over()

 

dense_rank() over()

rank() over() 와 마찬가지로 순서를 주지 않아 모든 행이 동일하게 1순위를 가집니다.

 

 

dense_rank() over(partition by ) 도 마찬가지 입니다.

 

 

 

 

 

dense_rank() over(order by )

rank()와 동일하게 차두리와 호나우지뉴, 손흥민과 네이마르가 같은 순위로 나오지만, 이번엔 다음 순위를 건너뛰지 않고 이어서 나옵니다.

 

 

 

 

dense_rank() over(partition by order by )

나라별로 나누고 팀으로 order by를 주었을 때 rank() 가 대한민국에서 1, 1, 3, 4 나왔던 것과의 차이점을 볼 수 있습니다.

 

 

 

 

 

 

 

 

728x90
반응형

댓글