[SQL] WINDOW - 순위 함수

SHONG·2024년 4월 2일

SQL

목록 보기
13/15
post-thumbnail

오늘 정처기 시험 문제를 풀다가WINDOW 함수에 대해 알게되었다. 사실 작년 시험칠 때 봤던 건데 역시나 까먹어버렸다...


WINDOW 함수

WINDOW 함수는 GROUP BY절을 이용하지 않고 함수의 인수로 지정한 속성의 값을 집계한다.

  • 그룹 내 순위 함수 : RANK, DENSE_RANK, ROW_NUMBER
  • 그룹 내 집계 함수 : SUM, MAX, MIN, AVG, COUNT
  • 그룹 내 행 순서 함수 : FIRST_VALUE, LAST_VALUE, LAG, LEAD
  • 그룹 내 비율 함수 : CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT

순위 함수

각 행의 순위를 매겨주는 함수이다. PARTITION BYGROUP BY처럼 사용하고 그 안에서 ORDER BY로 정렬이 가능하다.

  • ROW_NUMBER : 각 레코드에 대한 일련번호를 반환한다.
  • RANK : 순위를 반환하며, 공동 순위를 반환한다.
  • DENSE_RANK : 순위를 반환하며, 공동 순위를 무시한다.

문법

순위함수( ) OVER (ORDER BY 컬럼명)
또는
순위함수( ) OVER (PARTITION BY 컬럼명1 ORDER BY 컬럼명2)

📌 PARTITION BY가 없는 경우에는 모든 레코드를 대상으로 정렬과 순위를 매겨준다.


ROW_NUMBER

아래 테이블에서 '점수'에 대한 일련 번호를 구해보자

🔽 예제

과목이름점수
국어짱구70
국어철수80
국어유리90
---------
영어짱구50
영어철수90
영어유리90
---------
수학짱구70
수학철수70
수학유리90
SELECT 과목, 점수
	 , ROW_NUMBER() OVER (PARTITION BY 과목 ORDER BY 점수 DESC) AS NO
FROM 성적

🔽 출력 결과

과목점수NO
국어901
국어802
국어703
---------
영어901
영어902
영어503
---------
수학901
수학702
수학703

RANK

아래 테이블에서 '점수'에 대한 순위를 구해보자

🔽 예제

과목이름점수
국어짱구70
국어철수80
국어유리90
---------
영어짱구50
영어철수90
영어유리90
---------
수학짱구70
수학철수70
수학유리90
SELECT 과목, 점수
	 , RANK() OVER (PARTITION BY 과목 ORDER BY 점수 DESC) AS RANK
FROM 성적

🔽 출력 결과

과목점수RANK
국어901
국어802
국어703
---------
영어901
영어901
영어503 <<
---------
수학901
수학702
수학702

📌 영어 과목 처럼 동일한 순위가 부여되었을 경우 해당 순번만큼 건너 뛰고 순번을 부여한다.


DENSE_RANK

아래 테이블에서 '점수'에 대한 순위를 구해보자

🔽 예제

과목이름점수
국어짱구70
국어철수80
국어유리90
---------
영어짱구50
영어철수90
영어유리90
---------
수학짱구70
수학철수70
수학유리90
SELECT 과목, 점수
	 , DENSE_RANK() OVER (PARTITION BY 과목 ORDER BY 점수 DESC) AS RANK
FROM 성적

🔽 출력 결과

과목점수RANK
국어901
국어802
국어703
---------
영어901
영어901
영어502 <<
---------
수학901
수학702
수학702

📌 동일한 순위가 부여되었어도 다음 순위를 출력하게 된다.

profile
핑계 대지 말자

0개의 댓글