오늘 정처기 시험 문제를 풀다가WINDOW 함수에 대해 알게되었다. 사실 작년 시험칠 때 봤던 건데 역시나 까먹어버렸다...
WINDOW 함수는 GROUP BY절을 이용하지 않고 함수의 인수로 지정한 속성의 값을 집계한다.
각 행의 순위를 매겨주는 함수이다. PARTITION BY를 GROUP BY처럼 사용하고 그 안에서 ORDER BY로 정렬이 가능하다.
ROW_NUMBER : 각 레코드에 대한 일련번호를 반환한다.RANK : 순위를 반환하며, 공동 순위를 반환한다.DENSE_RANK : 순위를 반환하며, 공동 순위를 무시한다.문법
순위함수( ) OVER (ORDER BY 컬럼명)
또는
순위함수( ) OVER (PARTITION BY 컬럼명1 ORDER BY 컬럼명2)
📌 PARTITION BY가 없는 경우에는 모든 레코드를 대상으로 정렬과 순위를 매겨준다.
아래 테이블에서 '점수'에 대한 일련 번호를 구해보자
🔽 예제
| 과목 | 이름 | 점수 |
|---|---|---|
| 국어 | 짱구 | 70 |
| 국어 | 철수 | 80 |
| 국어 | 유리 | 90 |
| --- | --- | --- |
| 영어 | 짱구 | 50 |
| 영어 | 철수 | 90 |
| 영어 | 유리 | 90 |
| --- | --- | --- |
| 수학 | 짱구 | 70 |
| 수학 | 철수 | 70 |
| 수학 | 유리 | 90 |
SELECT 과목, 점수
, ROW_NUMBER() OVER (PARTITION BY 과목 ORDER BY 점수 DESC) AS NO
FROM 성적
🔽 출력 결과
| 과목 | 점수 | NO |
|---|---|---|
| 국어 | 90 | 1 |
| 국어 | 80 | 2 |
| 국어 | 70 | 3 |
| --- | --- | --- |
| 영어 | 90 | 1 |
| 영어 | 90 | 2 |
| 영어 | 50 | 3 |
| --- | --- | --- |
| 수학 | 90 | 1 |
| 수학 | 70 | 2 |
| 수학 | 70 | 3 |
아래 테이블에서 '점수'에 대한 순위를 구해보자
🔽 예제
| 과목 | 이름 | 점수 |
|---|---|---|
| 국어 | 짱구 | 70 |
| 국어 | 철수 | 80 |
| 국어 | 유리 | 90 |
| --- | --- | --- |
| 영어 | 짱구 | 50 |
| 영어 | 철수 | 90 |
| 영어 | 유리 | 90 |
| --- | --- | --- |
| 수학 | 짱구 | 70 |
| 수학 | 철수 | 70 |
| 수학 | 유리 | 90 |
SELECT 과목, 점수
, RANK() OVER (PARTITION BY 과목 ORDER BY 점수 DESC) AS RANK
FROM 성적
🔽 출력 결과
| 과목 | 점수 | RANK |
|---|---|---|
| 국어 | 90 | 1 |
| 국어 | 80 | 2 |
| 국어 | 70 | 3 |
| --- | --- | --- |
| 영어 | 90 | 1 |
| 영어 | 90 | 1 |
| 영어 | 50 | 3 << |
| --- | --- | --- |
| 수학 | 90 | 1 |
| 수학 | 70 | 2 |
| 수학 | 70 | 2 |
📌 영어 과목 처럼 동일한 순위가 부여되었을 경우 해당 순번만큼 건너 뛰고 순번을 부여한다.
아래 테이블에서 '점수'에 대한 순위를 구해보자
🔽 예제
| 과목 | 이름 | 점수 |
|---|---|---|
| 국어 | 짱구 | 70 |
| 국어 | 철수 | 80 |
| 국어 | 유리 | 90 |
| --- | --- | --- |
| 영어 | 짱구 | 50 |
| 영어 | 철수 | 90 |
| 영어 | 유리 | 90 |
| --- | --- | --- |
| 수학 | 짱구 | 70 |
| 수학 | 철수 | 70 |
| 수학 | 유리 | 90 |
SELECT 과목, 점수
, DENSE_RANK() OVER (PARTITION BY 과목 ORDER BY 점수 DESC) AS RANK
FROM 성적
🔽 출력 결과
| 과목 | 점수 | RANK |
|---|---|---|
| 국어 | 90 | 1 |
| 국어 | 80 | 2 |
| 국어 | 70 | 3 |
| --- | --- | --- |
| 영어 | 90 | 1 |
| 영어 | 90 | 1 |
| 영어 | 50 | 2 << |
| --- | --- | --- |
| 수학 | 90 | 1 |
| 수학 | 70 | 2 |
| 수학 | 70 | 2 |
📌 동일한 순위가 부여되었어도 다음 순위를 출력하게 된다.