postgreSQL에서 그룹별 넘버링 방법 ( ROW_NUMBER, RANK, DENSE_RANK )
1. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 각 선수별로 가능한 포메이션을 기준으로 ROW_NUM 세팅 )
ROW_ID | NAME |
FORMATION | ROW_NUM |
1 | ERIKSEN | LWF | 1 |
2 | ERIKSEN | RWF | 2 |
3 | ERIKSEN | CAM | 3 |
4 | ERIKSEN | CM | 4 |
5 | KANE |
CF | 1 |
6 | SON |
CF | 1 |
7 | SON |
LWF | 2 |
8 | SON |
RWF | 3 |
9 | SON |
CAM | 4 |
10 | VERTONGHEN | CB | 1 |
11 | VERTONGHEN | LB | 2 |
SQL :
SELECT ROW_ID ,NAME ,FORMATION ,ROW_NUMBER() OVER( PARTITION BY NAME ORDER BY ROW_ID ) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 선수이름을 그룹으로 묶어서 ROW_NUMBER() 계산한다.
키워드 : ROW_NUMBER / PARTITION BY
ROW_ID | NAME |
GOAL | ROW_NUM |
1 | KANE |
15 | 1 |
2 | SON |
15 | 1 |
3 | ERIKSEN | 6 | 2 |
4 | ALLI | 4 | 3 |
5 | LAMELA | 4 | 3 |
6 | MOURA | 4 | 3 |
7 | VERTONGHEN | 3 | 4 |
8 | ALDERWEIRELD | 2 | 4 |
SQL :
SELECT ROW_ID ,NAME ,FORMATION ,DENSE_RANK() OVER( ORDER BY GOAL DESC) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용
동일한 득점이 있을 경우 그 다음 순위에 공백이 생기지 않는다 -> DENSE_RANK 함수 사용
키워드 : DENSE_RANK
ROW_ID | NAME |
GOAL | ROW_NUM |
1 | KANE |
15 | 1 |
2 | SON |
15 | 1 |
3 | ERIKSEN | 6 | 3 |
4 | ALLI | 4 | 4 |
5 | LAMELA | 4 | 4 |
6 | MOURA | 4 | 4 |
7 | VERTONGHEN | 3 | 7 |
8 | ALDERWEIRELD | 2 | 7 |
SQL :
SELECT ROW_ID ,NAME ,GOAL ,RANK() OVER( ORDER BY GOAL DESC ) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용
동일한 득점이 있을 경우 그 다음 순위에 공백이 생긴다 -> RANK 함수 사용
키워드 : RANK
4. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 선수 역할을 기준으로 득점 순위 계산 )
* 동일한 골 기록일 경우 같은 순위 랭크, 그 다음 순위는 RANK에 공백 순위 발생
ROW_ID | ROLL | NAME |
GOAL | ROW_NUM |
1 | ST | KANE |
15 | 1 |
2 | ST | SON |
15 | 1 |
3 | ST | LIORENTE | 10 | 3 |
4 | MF | ERIKSEN | 6 | 1 |
5 | MF | ALLI | 4 | 2 |
6 | MF | LAMELA | 4 | 2 |
7 | MF | MOURA | 4 | 2 |
8 | MF | WANYAMA | 1 | 5 |
9 | DF | VERTONGHEN | 3 | 1 |
10 | DF | ALDERWEIRELD | 2 | 2 |
SQL :
SELECT ROW_ID ,NAME ,GOAL ,RANK() OVER ( PARTITION BY ROLL ORDER BY GOAL DESC ) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 포지션 별 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용
동일한 득점이 있을 경우 그 다음 순위에 공백이 생긴다 -> RANK 함수 사용
포지션을 그룹으로 묶어준다 -> PARTITION BY 사용
키워드 : RANK / PARTITION BY
'DB' 카테고리의 다른 글
GRANT 권한 주기. SEARCH_PATH 세팅. (postgreSQL) (0) | 2019.11.22 |
---|---|
PostgreSQL에서 not equal 시 null 값 포함하여 처리하기(IS DISTINCT FROM) (0) | 2019.10.14 |