윈도우 함수 ① 순위
쉽게 말하면
윈도우 함수는 줄을 줄이지 않고, 각 줄 옆에 '다른 줄과 비교한 값'을 붙여 줘요. 순위 함수가 대표적이에요. 동점이 있을 때 RANK는 다음 순위를 건너뛰고(1, 2, 2, 4), DENSE_RANK는 건너뛰지 않고(1, 2, 2, 3), ROW_NUMBER는 동점이어도 1, 2, 3, 4로 번호를 매겨요.
시험용 정의
윈도우 함수는 행을 없애지 않고, 각 행 옆에 다른 행들과 비교한 값(순위, 누적 합계 등)을 붙인다. 함수() OVER (PARTITION BY 그룹 ORDER BY 정렬) 모양이다. 순위 함수 세 가지: RANK(동점이면 같은 순위, 다음 순위 건너뜀), DENSE_RANK(같은 순위, 건너뛰지 않음), ROW_NUMBER(동점이어도 1, 2, 3 고유 번호).
비유로 이해하기
마라톤 기록표다. RANK는 공동 2등이 둘이면 다음 사람이 4등, DENSE_RANK는 다음 사람이 3등, ROW_NUMBER는 결승선 통과 순서대로 번호표를 하나씩 준다. PARTITION BY는 '연령대별로 따로 순위 매기기'다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 윈도우 | 함수가 계산할 때 바라보는 행들의 범위 |
| OVER | 윈도우 함수임을 알리는 키워드. 뒤 괄호에 범위와 정렬을 쓴다 |
| PARTITION BY | 윈도우를 나누는 기준. GROUP BY와 비슷하지만 행을 줄이지 않는다 |
| 동점 | 정렬 기준 값이 같은 행들 |
윈도우 함수 문법
함수(인수) OVER ( [PARTITION BY 열] [ORDER BY 열 [ASC|DESC]] [윈도우 절] )
- PARTITION BY를 생략하면 전체가 하나의 윈도우
- 순위 함수는 ORDER BY가 꼭 있어야 한다
- 윈도우 함수는 SELECT·ORDER BY 절에만 쓸 수 있다. WHERE·GROUP BY·HAVING에서는 쓸 수 없어, 순위로 거르려면 인라인 뷰로 감싼다
- GROUP BY와 달리 결과 행 수가 줄지 않는다
순위 함수 비교 (급여 내림차순)
| 급여 | RANK | DENSE_RANK | ROW_NUMBER |
|---|---|---|---|
| 9000 | 1 | 1 | 1 |
| 5000 | 2 | 2 | 2 |
| 5000 | 2 | 2 | 3 |
| 3000 | 4 | 3 | 4 |
시험에 이렇게 나와요
- RANK·DENSE_RANK·ROW_NUMBER 결과값 계산 (동점 처리)
- PARTITION BY로 그룹별 순위, 행 수는 그대로
- 윈도우 함수는 WHERE에 못 씀 → 인라인 뷰로 감싸기
- OVER 절 문법 (PARTITION BY → ORDER BY → 윈도우 절 순서)
출제 범위·공식 안내 기반
확인 문제
Q1. 급여가 (9000, 5000, 5000, 3000)일 때 3000의 RANK와 DENSE_RANK는?
- 3, 4
- 4, 3
- 3, 3
- 4, 4
정답 보기
2번 4, 3
RANK는 공동 순위가 있으면 그 수만큼 다음 순위를 건너뛴다(1, 2, 2, 4). DENSE_RANK는 건너뛰지 않는다(1, 2, 2, 3).
Q2. 점수가 (100, 90, 90, 90, 80)일 때 80점의 RANK, DENSE_RANK, ROW_NUMBER는?
- 5, 3, 5
- 5, 5, 5
- 4, 3, 5
- 3, 3, 5
정답 보기
1번 5, 3, 5
RANK는 1, 2, 2, 2, 5 / DENSE_RANK는 1, 2, 2, 2, 3 / ROW_NUMBER는 5.
Q3. 윈도우 함수에 대한 설명으로 틀린 것은?
- 결과 행 수가 줄어들지 않는다
- PARTITION BY를 생략하면 전체가 하나의 그룹이다
- OVER 키워드를 쓴다
- WHERE 절에서 순위로 바로 거를 수 있다
정답 보기
4번 WHERE 절에서 순위로 바로 거를 수 있다
WHERE에서는 쓸 수 없다. 인라인 뷰로 감싼 뒤 바깥에서 거른다.
Q4. 동점이 있어도 반드시 서로 다른 번호를 매기는 함수는?
- NTILE
- DENSE_RANK
- ROW_NUMBER
- RANK
정답 보기
3번 ROW_NUMBER
ROW_NUMBER다. RANK는 동점에 같은 순위를 주고 다음 순위를 건너뛰며(1, 1, 3), DENSE_RANK는 건너뛰지 않는다(1, 1, 2).
Q5. 점수가 (100, 90, 90, 80)일 때 80점의 DENSE_RANK는?
- 1
- 2
- 3
- 4
정답 보기
3번 3
DENSE_RANK는 동점 뒤 순위를 건너뛰지 않는다. RANK라면 4.
Q6. 윈도우 함수로 구한 순위로 상위 3명만 거르려면?
- HAVING RANK() <= 3
- WHERE RANK() OVER (ORDER BY sal DESC) <= 3
- GROUP BY RANK()
- 인라인 뷰에서 순위를 구하고 바깥 WHERE로 거른다
정답 보기
4번 인라인 뷰에서 순위를 구하고 바깥 WHERE로 거른다
윈도우 함수는 WHERE 절에 쓸 수 없다.
헷갈리기 쉬운 O·X
DENSE_RANK는 동점이 있으면 다음 순위를 건너뛴다.
정답 보기
X 건너뛰는 것은 RANK. DENSE_RANK는 연속된다.
PARTITION BY는 GROUP BY처럼 결과 행을 그룹당 한 행으로 줄인다.
정답 보기
X 행 수는 그대로이고 계산 범위만 나눈다.
RANK() OVER (ORDER BY sal DESC)에서 급여가 가장 높은 사원의 순위는 1이다.
정답 보기
O 내림차순이라 가장 큰 값이 1.