기본 콘텐츠로 건너뛰기

SQL PERCENT_RANK - 상대 순위 매기기

SQL의 percent_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함수와 같다.

끝.

댓글

이 블로그의 인기 게시물

파이썬(Python)을 이용한 산점도(scatter) 그리기

파이썬의 Matplotlib를 이용해 데이터의 산점도(scatter plot)를 그릴 수 있다. 예시를 통해 살펴보자. 먼저 아래와 같이 데이터 프레임 예시를 만든다. 1 2 3 4 5 6 7 8 9 10 import pandas as pd height = [ 170 , 168 , 177 , 181 , 172 , 171 , 169 , 175 , 174 , 178 , 170 , 167 , 177 , 182 , 173 , 171 , 170 , 179 , 175 , 177 , 186 , 166 , 183 , 168 ] weight = [ 70 , 66 , 73 , 77 , 74 , 73 , 69 , 79 , 77 , 80 , 74 , 68 , 71 , 76 , 78 , 72 , 68 , 79 , 77 , 81 , 84 , 73 , 78 , 69 ] # DataFrame 만들기 body = pd . DataFrame( { 'height' : height, 'weight' : weight} ) body라는 이름의 데이터 프레임(테이블)이 만들어졌다. 이제, body 테이블의 데이터들의 분포를 산점도로 그려보자. 산점도를 그리는 코드는 아래와 같다. 1 2 3 4 5 6 7 8 9 10 # 산점도(scatter) 그리기 import matplotlib.pylab as plt plt . scatter( body[ 'weight' ], body[ 'height' ], label = "data" ) plt . legend(loc = "best" ) plt . xlabel( 'weight' ) plt . ylabel( 'height'

웨딩 드레스 스케치 도안

웨딩 드레스샵 투어를 다니면서 샘플로 드레스를 입는 경우에는 드레스 사진을 찍지 못하게 하는 샵이 많다. ​ 그래서 투어를 돌고 나면 어떤 샵의 어떤 스타일이 신부에게 잘 어울렸는지 헷갈릴 수가 있다. ​ 하지만 투어를 다닐 때 드레스샵에서 입은 드레스의 특징과 느낌을 잘 기록하면 샵을 선택하는 데 도움이 될 수 있다. ​ 드레스 투어를 다닐 때 드레스를 기록할 스케치 도안은 아래 링크에서 확인/다운로드 할 수 있다. 웨딩 드레스 스케치 도안 확인/다운로드 하기 투어를 마친 후 드레스샵과 계약을 하고, 드디어 본식 드레스를 고를 때에는 사진을 찍을 수 있는 경우가 많다. ​ 이 땐 사진을 잘 찍어서 어떤 드레스를 입을지 잘 선택하도록 하자. ​ ​

DEMOS Calculator - 웹에서 그래프 그리기

수식의 그래프를 그려보고 싶을 때 편리한 웹 서비스가 있어서 소개한다. DEMOS Calculator(https://www.desmos.com/calculator) DEMOS Calculator는 수식을 입력하면 자동으로 그래프를 그려준다. 아래는 로그함수를 입력한 모습이다. 좌측 영역의 수식 입력창에 수식을 입력하면 실시간으로 그래프를 확인할 수 있다. 좌측 상단의 햄버거 바를 클릭하면 아래와 같이 다양한 예시 그래프들도 확인할 수 있다. 수학식에 따라 그래프를 깔끔하게 그려야 할 때 요긴하게 사용할 수 있는 웹 서비스이다. 끝.