2023.09.07 - [자격증고나리/⚽ SQLD 슈웃] - [SQL] 상위 n개를 선택하는 윈도우 함수 (LIMIT,TOP,ROWNUM, FETCH FRIST)
앞선 포스팅에서 상위 n개의 레코드를 구하는 함수를 살펴봤는데
이번엔 비슷하지만 다른 순위를 구하는 함수에 대해 알아보자
단순히 전체 데이터중 상위 n개를 구하는 LIMIT와 같은 함수와는 달리
각 레코드 별 순위를 매겨 그 중 n등까지를 조회하는 함수로 RANK(), DENSE_RANK(), ROW_NUMBER() 세 가지가 있다
유사하지만 디테일이 조금씩 다르니 차이를 잘 알아놓는게 포인트임!!
예를 들어, 학생테이블이 다음과 같을 때 점수를 기준으로 순위를 매겨보자
홍길동, 김길동,차길동 학생의 점수가 100점으로 같을 때 순위를 매길 수 있는 방법은 세가지가 있다
학번 | 이름 | 점수 |
0001 | 홍길동 | 100 |
0002 | 김길동 | 90 |
0003 | 박길동 | 100 |
0004 | 차길동 | 100 |
일단 등수를 매기기 전 테이블을 점수를 기준으로 내림차순 정렬하는 과정은 동일함
1. RANK()
점수가 100점으로 가장 높은 세 학생에게 모두 1등을 주고, 그 다음 순서인 90점에게 4등을 주는 방법
(동일 순위가 발생했다면 그 수만큼 다음 순위를 건너뛰고 등수를 매김)
학번 | 이름 | 점수 | 등수 |
0001 | 홍길동 | 100 | 1 |
0003 | 박길동 | 100 | 1 |
0004 | 차길동 | 100 | 1 |
0002 | 김길동 | 90 | 4 |
DENSE_RANK()
점수가 100점으로 가장 높은 세 학생에게 모두 1등을 주고, 그 다음 순서인 90점에게 2등을 주는 방법
(동일 순위가 발생했어도 순위를 건너뛰지 않고 등수를 매김)
학번 | 이름 | 점수 | 등수 |
0001 | 홍길동 | 100 | 1 |
0003 | 박길동 | 100 | 1 |
0004 | 차길동 | 100 | 1 |
0002 | 김길동 | 90 | 2 |
ROW_NUMBER()
점수가 같더라도 각 학생마다 같은 등수를 주지 않는 방법
(각 행마다 고유한 번호를 부여)
학번 | 이름 | 점수 | 등수 |
0001 | 홍길동 | 100 | 1 |
0003 | 박길동 | 100 | 2 |
0004 | 차길동 | 100 | 3 |
0002 | 김길동 | 90 | 4 |
사용예시
SELECT
StudentID,
Score,
RANK() OVER (ORDER BY Score DESC) AS Rank -- rank()대신 dense_rank(), row_number() 사용가능
FROM
Scores;
'자격증고나리 > ⚽ SQLD 슈웃' 카테고리의 다른 글
[SQL] 이전, 이후 행과 관련된 키워드(LAG, LEAD / PRECEDING, FOLLOWING) (0) | 2023.09.07 |
---|---|
[SQL] 상위 n개를 선택하는 윈도우 함수 (LIMIT,TOP,ROWNUM, FETCH FRIST) (0) | 2023.09.07 |
[SQL] NOT EXISTS (0) | 2023.09.06 |
[SQL] 데이터베이스의 JOIN (0) | 2023.09.06 |
데이터베이스의 함수 (0) | 2023.09.05 |