공든탑앱 열기

윈도우 함수 ① 순위

SQLD (SQL 개발자) · 그룹 함수와 윈도우 함수 · 약 13분

쉽게 말하면

윈도우 함수는 줄을 줄이지 않고, 각 줄 옆에 '다른 줄과 비교한 값'을 붙여 줘요. 순위 함수가 대표적이에요. 동점이 있을 때 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와 달리 결과 행 수가 줄지 않는다

순위 함수 비교 (급여 내림차순)

급여RANKDENSE_RANKROW_NUMBER
9000111
5000222
5000223
3000434

시험에 이렇게 나와요

출제 범위·공식 안내 기반

확인 문제

Q1. 급여가 (9000, 5000, 5000, 3000)일 때 3000의 RANK와 DENSE_RANK는?

  1. 3, 4
  2. 4, 3
  3. 3, 3
  4. 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는?

  1. 5, 3, 5
  2. 5, 5, 5
  3. 4, 3, 5
  4. 3, 3, 5
정답 보기

1번 5, 3, 5

RANK는 1, 2, 2, 2, 5 / DENSE_RANK는 1, 2, 2, 2, 3 / ROW_NUMBER는 5.

Q3. 윈도우 함수에 대한 설명으로 틀린 것은?

  1. 결과 행 수가 줄어들지 않는다
  2. PARTITION BY를 생략하면 전체가 하나의 그룹이다
  3. OVER 키워드를 쓴다
  4. WHERE 절에서 순위로 바로 거를 수 있다
정답 보기

4번 WHERE 절에서 순위로 바로 거를 수 있다

WHERE에서는 쓸 수 없다. 인라인 뷰로 감싼 뒤 바깥에서 거른다.

Q4. 동점이 있어도 반드시 서로 다른 번호를 매기는 함수는?

  1. NTILE
  2. DENSE_RANK
  3. ROW_NUMBER
  4. RANK
정답 보기

3번 ROW_NUMBER

ROW_NUMBER다. RANK는 동점에 같은 순위를 주고 다음 순위를 건너뛰며(1, 1, 3), DENSE_RANK는 건너뛰지 않는다(1, 1, 2).

Q5. 점수가 (100, 90, 90, 80)일 때 80점의 DENSE_RANK는?

  1. 1
  2. 2
  3. 3
  4. 4
정답 보기

3번 3

DENSE_RANK는 동점 뒤 순위를 건너뛰지 않는다. RANK라면 4.

Q6. 윈도우 함수로 구한 순위로 상위 3명만 거르려면?

  1. HAVING RANK() <= 3
  2. WHERE RANK() OVER (ORDER BY sal DESC) <= 3
  3. GROUP BY RANK()
  4. 인라인 뷰에서 순위를 구하고 바깥 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.

함께 보면 좋은 개념