MS SQL Server PARTITION BY 함수를 활용한 성적 순위 매기기

요구사항 다수의 시험 응시자에 대한 성적 데이터가 존재하며, 각각의 성적은 총점과 두 개의 부분 점수(시험1, 시험2)로 구성되며, 지원한 직무명, 이름 등의 정보도 포함된다. 이때 총점을 기준으로 순위를 매기고, 점수가 동일할 경우는 동점 처리를 하되, 다음 순위는 연속적으로 증가하도록 (예: 1등이 2명이면 다음은 3등) 한다. 또한 동점일 경우 추가로 부분 점수를 기준으로 재정렬하는 요구사항을 만족하기 위해 PARTITION BY를 활용한 해결 방안을 제시한다.

주요 구현 목표:

  • 기본 성적 및 인적 정보를 포함하는 뷰 생성
  • 총점 기준으로 순위 계산 (동점 처리)
  • 동점 발생 시 부분 점수 기준으로 보완 정렬

실행 환경

  • 운영체제: Windows Server 2019 DataCenter
  • 데이터베이스: Microsoft SQL Server 2016
  • .NET Framework: 4.7.2

뷰 설계 성적 정보를 담는 뷰 v_cj의 스키마는 다음과 같다:

번호 필드명 타입 설명
1 zwmc nvarchar 직무명 (분류 기준)
2 xm nvarchar 응시자 이름
3 kscj1 float 시험1 점수 (총점 산출용)
4 kscj2 float 시험2 점수 (총점 산출용)
5 kszcj float 총점 (순위 기준)

기능 구현

기본 데이터 확인 v_cj 뷰에서 데이터를 조회하면 아래와 같은 원시 데이터를 확인할 수 있다. 이는 정렬되지 않은 상태이며, 이후 순위 계산을 위한 기초 자료이다.

SQL 쿼리 작성 총점 기준으로 순위를 매기는 기본 쿼리는 다음과 같다:

SELECT 
    zwmc,
    xm,
    kscj1,
    kscj2,
    kszcj,
    RANK() OVER (
        PARTITION BY zwmc 
        ORDER BY kszcj DESC
    ) AS rank_score
FROM v_cj;

실행 결과는 각 직무별로 총점이 높은 순서대로 순위가 부여되며, 동점인 경우 같은 순위가 부여되고, 다음 순위는 해당 순위의 다음 값으로 이어진다 (예: 1위가 2명이면 다음은 3위가 아님, 3위로 넘어감).

핵심 로직: RANK() OVER (PARTITION BY zwmc ORDER BY kszcj DESC)zwmc(직무명) 기준으로 그룹화하고, kszcj(총점)을 내림차순으로 정렬하여 순위를 부여한다.

보완 정렬 적용 동점이 발생할 경우, 추가로 kscj1, kscj2 점수를 기준으로 재정렬하고자 할 때는 다음과 같이 쿼리를 확장할 수 있다:

SELECT 
    zwmc,
    xm,
    kscj1,
    kscj2,
    kszcj,
    rank_score
FROM v_cj
ORDER BY 
    zwmc,
    rank_score,
    kscj1 DESC,
    kscj2 DESC;

또는 뷰 내부에 rank_score를 포함해 별도로 정렬 조건을 명시할 수 있다. 이는 동점 시 보조 기준으로 부분 점수를 활용하여 더 정밀한 순위를 도출한다.

전체 순위 생성 (동점 없이 연속 순위) 만약 동점일지라도 항상 고유한 순위를 부여하고 싶다면 ROW_NUMBER() 함수를 사용해야 한다. 예시:

SELECT 
    zwmc,
    xm,
    kscj1,
    kscj2,
    kszcj,
    RANK() OVER (
        PARTITION BY zwmc 
        ORDER BY kszcj DESC
    ) AS rank_score,
    ROW_NUMBER() OVER (
        PARTITION BY zwmc 
        ORDER BY kszcj DESC, kscj1 DESC, kscj2 DESC
    ) AS final_rank
FROM v_cj;

이 경우, final_rank는 동점 상황에서도 중복 없이 연속된 숫자를 부여하며, 총점 → 부분점수1 → 부분점수2 순으로 우선순위를 결정한다.

결과는 rank_score 필드가 동점 처리된 순위, final_rank가 모든 항목을 기준으로 고유한 순위를 나타낸다.

태그: MS SQL Server PARTITION BY RANK() ROW_NUMBER() 순위 계산

5월 22일 19:47에 게시됨