SQL의 percent_rank 함수를 사용해서 데이터의 상대 순위를 매길 수 있다.
순위를 매기는 방식은 기본적으로 rank 함수와 같다. rank 함수에 대한 설명은 "SQL RANK - 순위 매기기" 포스팅에서 자세히 확인할 수 있다.
percent_rank는 1등을 0, 마지막 등수를 1로 출력한다는 점이 rank와 다르다.
아래의 샘플 테이블을 통해 살펴보자.
상대 순위를 매기는 코드는 아래와 같다.
위 코드를 실행시키면 아래와 같은 결과를 얻을 수 있다.
기본 문법은 percent_rank () over (order by columns)이다. 더 자세히 살펴보자.
- order by는 상대 순위를 매기는 기준을 나타낸다. 다시말해 order by의 칼럼을 기준으로 상대 순위를 매긴다. Robert의 키가 큰 순서로 상대 순위를 매기기 위해 desc를 붙여 내림차순을 해주었다. desc가 없으면 오름차순으로 상대 순위를 매긴다.
- 상대 순위는 1등은 0, 마지막 등수는 1로 표시된다.
- partition by는 파티션(그룹)을 만들어서 상대 순위를 매긴다. partition by _name이므로 _name을 기준으로 파티션을 만들어서 파티션 안에서 order by로 상대 순위를 매긴다. _name으로 파티션을 만들었으므로 _name이 다른 행들은 모두 1등이 되어 출력 값은 0이고, Robert는 4개의 데이터로 순위가 매겨졌다. partition by가 없다면 전체 행을 order by 기준으로 상대 순위를 매긴다.
- Robert의 순위를 살펴보자. 데이터는 4개이다. 1등은 0으로 출력되고 마지막 등수는 2로 출력된다. 그러면 나머지 2개가 0과 1 사이에서 균등한 소수점으로 배분된다. 2개의 데이터가 0과 1를 3등분하여, 2등은 0.33으로 3등은 0.66으로 등수가 매겨지게 된다. 하지만 위 예시는 동점이 생겨서 2등인 0.33만 출력되었다.
- Robert의 동점을 살펴보자. 동점은 같은 순위를 매긴다. 그리고 동점이 생긴 만큼 그 다음 등수는 뒤로 밀린다. rank함수와 같다.
끝.
순위를 매기는 방식은 기본적으로 rank 함수와 같다. rank 함수에 대한 설명은 "SQL RANK - 순위 매기기" 포스팅에서 자세히 확인할 수 있다.
percent_rank는 1등을 0, 마지막 등수를 1로 출력한다는 점이 rank와 다르다.
아래의 샘플 테이블을 통해 살펴보자.
1 2 3 4 5 6 7 8 9 10 | CREATE TABLE body (height float, _name text); INSERT INTO body VALUES(174.52, 'Tom'); INSERT INTO body VALUES(167.33, 'Lucy'); INSERT INTO body VALUES(174.52, 'Frank'); INSERT INTO body VALUES(168.89, 'Jane'); INSERT INTO body VALUES(177.80, 'Robert'); INSERT INTO body VALUES(175.77, 'Robert'); INSERT INTO body VALUES(175.77, 'Robert'); INSERT INTO body VALUES(170.40, 'Robert'); |
상대 순위를 매기는 코드는 아래와 같다.
1 2 3 | select percent_rank () over (partition by _name order by height desc) as percent_ranking, _name, height from body ; |
위 코드를 실행시키면 아래와 같은 결과를 얻을 수 있다.
기본 문법은 percent_rank () over (order by columns)이다. 더 자세히 살펴보자.
- order by는 상대 순위를 매기는 기준을 나타낸다. 다시말해 order by의 칼럼을 기준으로 상대 순위를 매긴다. Robert의 키가 큰 순서로 상대 순위를 매기기 위해 desc를 붙여 내림차순을 해주었다. desc가 없으면 오름차순으로 상대 순위를 매긴다.
- 상대 순위는 1등은 0, 마지막 등수는 1로 표시된다.
- partition by는 파티션(그룹)을 만들어서 상대 순위를 매긴다. partition by _name이므로 _name을 기준으로 파티션을 만들어서 파티션 안에서 order by로 상대 순위를 매긴다. _name으로 파티션을 만들었으므로 _name이 다른 행들은 모두 1등이 되어 출력 값은 0이고, Robert는 4개의 데이터로 순위가 매겨졌다. partition by가 없다면 전체 행을 order by 기준으로 상대 순위를 매긴다.
- Robert의 순위를 살펴보자. 데이터는 4개이다. 1등은 0으로 출력되고 마지막 등수는 2로 출력된다. 그러면 나머지 2개가 0과 1 사이에서 균등한 소수점으로 배분된다. 2개의 데이터가 0과 1를 3등분하여, 2등은 0.33으로 3등은 0.66으로 등수가 매겨지게 된다. 하지만 위 예시는 동점이 생겨서 2등인 0.33만 출력되었다.
- Robert의 동점을 살펴보자. 동점은 같은 순위를 매긴다. 그리고 동점이 생긴 만큼 그 다음 등수는 뒤로 밀린다. rank함수와 같다.
끝.
댓글
댓글 쓰기