Data/Data Analysis
[SQL] RANK(), ROW_NUMBER(), DENSE_RANK()
재융
2020. 8. 5. 10:53
반응형
RANK()
함수는 중복 순위 다음은 해당 개수만큼 건너뛰고 반환
예를들어서 다음과 같은 A테이블이 있다하면
pay | user |
4.00$ | A |
3.00$ | B |
3.00$ | C |
2.00$ | D |
select rank() over(order by pay desc) as rank, pay, user
from A
다음과 같이 출력이된다
rank | pay | user |
1 | 4.00$ | A |
2 | 3.00$ | B |
2 | 3.00$ | C |
4 | 2.00$ | D |
ROW_NUMBER()
함수는 중복 순위 상관없이 순차적으로 반환
select row_number() over(order by pay desc) as rank, pay, user
from A
rank | pay | user |
1 | 4.00$ | A |
2 | 3.00$ | B |
3 | 3.00$ | C |
4 | 2.00$ | D |
DENSE_RANK()
select dense_rank() over(order by pay desc) as rank, pay, user
from A
rank | pay | user |
1 | 4.00$ | A |
2 | 3.00$ | B |
2 | 3.00$ | C |
3 | 2.00$ | D |
만약 그룹별로 순위를 매기고싶다면 over문에 partition by 구문을 추가하면 된다
만약 다음과같이 B테이블이 있다면
pay | user | team |
4.00$ | A | J |
3.00$ | B | J |
3.00$ | C | B |
2.00$ | D | B |
예시로 row_number함수를 이용한다치면
select row_number() over(partition by team order by pay desc) as rank, pay, user, team
from A
row_number | pay | user | team |
1 | 4.00$ | A | J |
2 | 3.00$ | B | J |
1 | 3.00$ | C | B |
1 | 2.00$ | D | B |
팀에 따라서 row_number수를 보여주게 된다
반응형