20230323_(SQL Server)_PARTITION BY 함수 및 순위 함수

MSSQL – PARTITION BY 함수 및 순위 함수


20230323_(SQL Server)_PARTITION BY 함수 및 순위 함수 1

> 로 나누다

파티션 테이블 기능그룹 내 순위 및 그룹별 집계를 얻는 데 유용할 수 있습니다.

SELECT 순위_함수() OVER (PARTITION BY 칼럼_명 ORDER BY 칼럼명 (ASC | DESC)
FROM 테이블_명;


SELECT 집계_함수(칼럼_명) OVER (PARTITION BY 칼럼_명)
FROM 테이블_명;


> 순위 및 집계 함수

순위 함수 집계 함수
LINENUMBER() 총)
계급() AVERAGE(평균)
DENSE_RANK() MAX, MIN(최대값, 최소값)
개수(개수)


> PARTITION BY 및 순위 함수 또는 집계 함수의 예

먼저 tempDB에 다음과 같은 임시 테이블을 생성합니다.

Use tempDB;

CREATE TABLE #tmpTbl (
	F_SEQ INT IDENTITY(1,1)
	, F_NAME VARCHAR(10)
	, F_CLASS VARCHAR(10)
	, F_SCORE INT
	);

그리고 임의의 날짜를 입력합니다.


20230323_(SQL Server)_PARTITION BY 함수 및 순위 함수 2

(1) 학생 순위

순위 함수 ROW_NUMBER()를 사용하면 쉽게 순위를 매길 수 있습니다.

SELECT ROW_NUMBER() OVER (ORDER BY F_SCORE DESC) 'F_GRADE', F_CLASS, F_NAME, F_SCORE
FROM #tmpTbl;


20230323_(SQL Server)_PARTITION BY 함수 및 순위 함수 3

이때, LINENUMBER() 기능은 같은 점수를 받은 학생은 같은 등급을 받지 않습니다.

(즉, 중복 순위 무시, 동일한 값이 있는 경우 동일한 순위가 존재하지 않도록 순차적으로 정렬)


20230323_(SQL Server)_PARTITION BY 함수 및 순위 함수 4

다른 결과를 보고 싶다면 나머지 순위 기능을 사용할 수 있습니다.

계급()

SELECT RANK() OVER (ORDER BY F_SCORE DESC) 'F_GRADE', F_CLASS, F_NAME, F_SCORE
FROM #tempTbl;


20230323_(SQL Server)_PARTITION BY 함수 및 순위 함수 5

순위() 함수~이다 점수가 같으면 같은 등급을 받습니다.

(그리고 더블랭킹 적용 후, 변화있다)

DENSE_RANK()

SELECT DENSE_RANK() OVER (ORDER BY F_SCORE DESC) 'F_GRADE', F_CLASS, F_NAME, F_SCORE 
FROM #tmpTbl;


20230323_(SQL Server)_PARTITION BY 함수 및 순위 함수 6

DENSE_RANK() 일도 한다 점수가 같으면 같은 등급이 부여됩니다.

(단, 다음 순위는 더 나아가 어때 계속)


(2) 반별 학생 순위

앞선 예시에서는 반과 상관없이 성적이 좋은 학생들이 먼저 나열되었으나 이제는 반으로 그것들을 나열합시다.

이 경우 PARTITION BY 함수를 사용합니다.

— 순위를 F_CLASS로 나누는 쿼리문을 생성합니다.

SELECT F_CLASS, ROW_NUMBER() OVER(PARTITION BY F_CLASS ORDER BY F_SCORE DESC) 'F_GRADE', F_NAME, F_SCORE
FROM #tmpTbl;


20230323_(SQL Server)_PARTITION BY 함수 및 순위 함수 7


(3) 각 반의 총점을 결정

학생들이 속한 수업의 총점을 구해봅시다.

SELECT F_CLASS, F_NAME, F_SCORE, SUM(F_SCORE) OVER(PARTITION BY F_CLASS) 'CLASS TOTAL'
FROM #tmpTbl;


20230323_(SQL Server)_PARTITION BY 함수 및 순위 함수 8