요구사항
다수의 시험 응시자에 대한 성적 데이터가 존재하며, 각각의 성적은 총점과 두 개의 부분 점수(시험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가 모든 항목을 기준으로 고유한 순위를 나타낸다.