[데이터베이스 SQL 완전정복 링크]
안녕하세요
오늘은 순위매기는 함수에 대해서 알아볼거예요~~!
순위 매기는 함수 종류
1. ROW_NUMBER
2. RANK
3. DENSE_RANK
요 세놈 다 순위를 매겨주는 함수입니다.
그럼 세개 각각 무슨 차이가 있을까요?
요약하자면 RANK, DENSE_RANK는 공동순위를 인정해줍니당.
ROW_NUMER는 공동순위 없어요 무조건 1등 2등 3등 4등...
좀 더 자세히 살펴볼까요~?
순위 매기는 함수 결과 차이
요렇게 데이터가 있다고 합시다.
누가봐도 1등은 아리이고, 꼴찌는 노바네요.
ROW_NUMBER와 RANK 그리고 DENSE_RANK 함수를 이용해서 순위를 매겨보고 어떻게 다른지 결과만 먼저 비교해볼께요
중요한 포인트는 동일 점수가 있을 경우 입니다.
티모와 베인이 둘 다 70으로 점수가 같아요.
♠ ROW_NUMBER
ROW_NUMBER의 경우 동점이여도, 순위는 다릅니다.
레코드(행) 개수가 결국 순위 개수예요.
티모도 70점이고 베인도 70점이지만, 티모가 2등 베인이 3등이예요.
기본 테이블에서 티모가 베인보다 앞이였기 때문에 티모가 2등을 차지했습니다.
즉 동점이면 정렬순에 따라 등수를 매기게 된다~~
♠ RANK
동점인데 순위가 밀리면 억울하잖아요!
RANK는 보면 동점이면 동등한 순위를 부여합니다.
70점으로 점수가 같은 티모와 베인이 동시에 2등을 했어요.
레코드(행) 개수가 결국 순위개수라는곤 ROW_NUMBER이랑 동일합니다.
즉 티모와 베인이 공동 2등을 하면서 3등이 사라진거..!
그 다음 순위인 한조는 4등이 됩니다. 그리고 꼴등은 5등이 되는거죠.
♠ DENSE_RANK
근데 3등이 없다니 뭔가 헷갈릴 수 있을것같아
나는 점수가 동일할 경우 순위는 똑같지만 등수가 건너뛰지 않고 쭉 이어졌으면 좋겠어 할수도 있겠죠?
그게 바로 DENSE_RANK입니다.
70점으로 점수가 같은 티모와 베인이 공동 2등을 하고
다음 순위인 한조는 3등이 됩니다. 꼴등은 4등! 즉 참가자 수가 꼭 마지막 등수랑 동일한 건 아네요.
기억하기 쉽게~
NUMBER는 숫자니까 공동이란 개념이 없음, 무조건 1,2,3,4,5,6,7~~
RANK는 공동2등 공동3등 이런걸 인정해준다.
dense는 밀집한, 압축된 이런 뜻이 있잖아요? dense가 들어가면 등수 건너뛰기가 안된다고 생각하면 돼요.
그러니까 등수가 대상 수보다 작을 수밖에 없는거죠.
순위매기는 함수 문법, 사용법
ROW_NUMBER이랑, RANK 그리고 DENSE_RANK 사용법은 동일해요.
요 세 함수는 OVER절에서 지원해주는 집계 함수입니다.
그러므로 기본적으로 OVER절이 무엇인지에 대해서는 알고 있어야 해요!
▶ 2021.10.01 - [별걸다하는 IT/데이터베이스 Database] - [SQL] 오라클 over절에 대해 알아보자 - 개념 및 사용법 정리
혹시 OVER절을 모르시는 분들은 위 포스팅을 참고해주세요.
요렇게 하면 '컬럼' 순대로 등수를 매겨줍니다.
RANK() OVER (ORDER BY 점수 DESC)
→ 점수 내림차순으로 순위를 매긴다. (즉 점수가 높으면 순위가 높음)
RANK() OVER (ORDER BY PRICE)
→ 가격 오름차순 순으로 등급을 매긴다 (즉, 가격이 낮을 수록 순위가 높음)
앞의 예시를 쿼리로 짜보면~
SELECT 학생, 성적,
ROW_NUMBER() OVER (ORDER BY 성적 desc) ROW_NUMBER결과,
RANK() OVER (ORDER BY 성적 desc) RANK결과,
DENSE_RANK() OVER (ORDER BY 성적 desc) DENSE_RANK결과
FROM (
SELECT '티모' 학생, 70 성적 FROM dual UNION all
SELECT '아리' 학생, 90 성적 FROM dual UNION all
SELECT '베인' 학생, 70 성적 FROM dual UNION all
SELECT '노바' 학생, 40 성적 FROM dual UNION all
SELECT '한조' 학생, 60 성적 FROM dual
) 점수표
요렇게 되는거죠~~
점수표 테이블은 제가 더미테이블 이용해서 이미로 만든거니까
중요한 부분은 SELECT에서 사용된 순위함수 사용한 문법을 보시면 됩니다.
동일한 그룹 내에서 순위를 매기고 싶으면 PARTITION BY를 활용해줍시다.
ROW_NUMBER() OVER (PARTITION BY 반 ORDER BY 성적 desc) ROW_NUMBER결과
반별로 성적순으로 순위를 매긴다~
간단하죠? 오늘 포스팅은 여기까지입니다. 다음 포스팅에서 봐요~!
'별걸다하는 IT > 데이터베이스 Database' 카테고리의 다른 글
[SQL] 정렬하기 order by 쿼리 사용법 1, 2 desc 의미 (0) | 2021.08.24 |
---|---|
[오라클 SQL] ROWNUM - 특정 개수의 행만 조회하기, 행 번호 매기기 rownum = 2, order by rownum (0) | 2021.06.10 |
[데이터베이스 SQL 기초] 오라클, MySQL 결과 중복 제거 DISTINCT에 사용법 (0) | 2021.04.01 |
[오라클 MySQL 기초] BETWEEN, NOT BETWEEN 쿼리 결과 범위 조회하는 법, 비트윈사용법 (0) | 2021.03.30 |
[오라클, MySQL] 대소문자와 관련된 UPPER, LOWER, INITCAP함수 사용법. 대문자로 변경, 소문자로 변경 (0) | 2021.03.13 |
최신 댓글