1. ROW_NUMBER()이란?
ROW_NUMBER은 정해준 기준대로 순서를 매겨주는 함수입니다.
여기서 그룹별로 순서를 매길 수 있어요.
즉, 지정한 그룹안에서 지정한 순서(ORDER BY)에 따라 각 행에 고유한 순위를 부여하는 거죠.
2. 구문 형태
ROW_NUMBER() OVER (
PARTITION BY 그룹컬럼
ORDER BY 정렬기준컬럼 DESC/ASC)
| PARTITION BY | 그룹 나누는 기준 (생략 가능) |
| ORDER BY | 그룹 내에서 어떤 순서로 순위를 매길지 정함 |
| ROW_NUMBER() | 각 행에 1, 2, 3, ... 순위를 부여 |
그럼 여기서 의문이 떠오를실겁니다.
만약 동점이라서 순위가 같을 때는 둘다 같은 순위인건가?
만약 둘다 3순위면 그 다음 순위는 4순위인가 5순위인가?
이런 조건들을 구분해서 사용하는 함수도 존재합니다!
3. ROW_NUMBER vs RANK vs DENSE_RANK
| 함수 | 순위 중복 여부 | 다음 순위 건너뜀 | 예시(동점자 존재 시) |
| ROW_NUMBER() | ❌ 순위 중복 없음 | ✅ 건너뜀 없음 (무조건 1,2,3...) | 1,2,3,4... |
| RANK() | ✅ 동점 순위 같음 | ✅ 다음 순위 건너뜀 | 1,2,2,4... |
| DENSE_RANK() | ✅ 동점 순위 같음 | ❌ 건너뜀 없음 | 1,2,2,3... |
ROW_NUMBER()는 무조건 고유한 번호를 매긴다는 것!
4. ROW_NUMBER() 는 동점일 때 순위를 어떻게 정할까?
바로 ORDER BY 절 뒤에 있는 컬럼들을 순서대로 보고 판단합니다.
그래서 명시를 하지 않으면 임의 기준으로 순위가 정해지므로 예측 불가하게 될 수 있습니다!!
예를 들어 PRICE가 같다면 PRODUCT_NAME의 알파벳 분서대로 순위를 매긴다고 ORDER BY에 기준을 두는거죠.
ROW_NUMBER()는 무조건 고유한 번호를 매긴다는 것!
5. PARTITION BY를 생략하면?
전체 테이블을 하나의 그룹으로 보고 순위를 매기게 됩니다.
- PARTITION BY가 있으면 -> 그룹별로 순위
ROW_NUMBER() OVER (ORDER BY ~)
- PARTITION BY가 없으면 -> 전체 데이터를 하나의 그룹으로 보고 순위
ROW_NUMBER() OVER (PARTITION BY A ORDER BY B)
'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [프로그래머스]SQL쿼리테스트 Lv4(2) (2) | 2025.08.03 |
|---|---|
| [프로그래머스]SQL 쿼리테스트 Lv4(1) (1) | 2025.08.01 |
| [프로그래머스]SQL 쿼리테스트 Lv3(3) (6) | 2025.07.30 |
| [프로그래머스] SQL 쿼리테스트 Lv3(2) (2) | 2025.07.29 |
| [프로그래머스]SQL 쿼리테스트 Lv3(1) (5) | 2025.07.28 |
