- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 RANK 관련 함수 사용 시 동점자 처리로 인해 발생하는 순위 오류·불일치를 체계적으로 진단하고, 데이터 구조별로 실무에 바로 적용 가능한 해결 공식을 제시하는 것이다.
1. RANK 함수 계열의 동작 원리와 차이
엑셀의 순위 함수는 크게 세 가지로 구분되며 동점자 처리 방식이 다르다.
| 함수 | 설명 | 동점자 처리 | 정렬 방향 | 버전 |
|---|---|---|---|---|
| RANK | 이전 버전 호환용 함수이다. | 동점자에 동일 순위를 부여하고 다음 순위는 건너뛴다. | 0 또는 생략: 내림차순, 기타: 오름차순이다. | 레거시(호환성 유지) |
| RANK.EQ | 권장 대체 함수이다. | 동점자에 동일 순위를 부여하고 다음 순위는 건너뛴다. | 마지막 인수로 오름/내림 선택이 가능하다. | Excel 2010+ |
| RANK.AVG | 동점자의 평균 순위를 부여한다. | 동점자 평균 순위이다. | 마지막 인수로 오름/내림 선택이 가능하다. | Excel 2010+ |
2. 대표 오류 유형과 즉시 해결 체크리스트
- 동점자 이후 순위가 건너뛰어 누적 인원과 불일치하다.
- 정렬 방향을 잘못 지정해 역순으로 순위가 매겨진다.
- 숫자처럼 보이지만 텍스트 형식이라 순위가 비정상이다.
- 빈셀·에러값이 섞여 순위가 왜곡된다.
- 필터·부분합 상태에서 숨김행까지 랭크가 계산된다.
- 다중 기준(총점 동점 시 과목 점수 비교)이 반영되지 않는다.
| 증상 | 원인 | 신속 해결책 |
|---|---|---|
| 동점 이후 순위가 건너뜀 | 기본 동작은 경쟁순위 방식이다. | RANK.EQ 결과에 DENSE_RANK 보정 또는 타이브레이커를 적용한다. |
| 순위 방향 뒤바뀜 | 세 번째 인수 지정 오류이다. | 내림차순: 0 또는 생략, 오름차순: 1로 설정한다. |
| 일부 값만 순위가 이상함 | 텍스트 숫자 혼입이다. | VALUE, --, TEXTSPLIT 검사 또는 데이터 유효성으로 숫자 강제한다. |
| 빈셀·에러 포함 | 참조 범위에 비숫자 값이 있다. | IFERROR, ISNUMBER 필터링 후 랭크한다. |
| 숨김행 포함 계산 | RANK는 가시성 인식이 없다. | SUBTOTAL+FILTER로 보이는 행만 랭크한다. |
| 다중 기준 미반영 | 단일 값만 랭크한다. | COUNTIF/COUNTIFS로 동점 내 2차 지표를 반영한다. |
3. 동점자 처리 전략 선택 가이드
3.1 경쟁순위 유지(RANK.EQ)
스포츠·영업 랭킹처럼 동점자에 동일 순위를 주고 다음 순위를 건너뛰는 방식이다.
=RANK.EQ(B2, $B$2:$B$100, 0) 0은 내림차순이며 점수가 높을수록 좋은 순위를 의미한다.
3.2 평균순위(RANK.AVG)
평가 공정성 확보를 위해 동점자에게 평균 순위를 부여한다.
=RANK.AVG(B2, $B$2:$B$100, 0) 동점이 많을수록 소수점 순위가 발생하므로 표시 형식을 정수 반올림 또는 소수 1~2자리로 설정하는 것이 좋다.
3.3 조밀 순위(DENSE RANK) 구현
동점자 다음 순위를 건너뛰지 않는 조밀 순위를 구현한다. 동적 배열을 사용할 수 있는 버전이라면 다음 공식을 권장한다.
=MATCH(B2, SORT(UNIQUE($B$2:$B$100),,-1), 0) UNIQUE로 서로 다른 점수 목록을 만들고 내림차순 정렬한 뒤 MATCH로 위치를 찾으면 조밀 순위가 된다.
4. 동점자 타이브레이커(2차 기준) 설계
총점이 같은 경우 특정 과목 점수, 최근 성과, 지각 횟수 등 2차 기준으로 순서를 안정화해야 한다. 두 가지 방법이 실무에 적합하다.
4.1 COUNTIFS로 동점 내 재정렬
기본 순위(경쟁순위)를 유지하되, 동순위 그룹 내부에서 보조 지표로 정렬 번호를 매긴다.
기본순위: =RANK.EQ($B2, $B$2:$B$100, 0) 동그룹-정렬: =COUNTIFS($B$2:$B$100, $B2, $C$2:$C$100, ">"&$C2)+1 최종표시: =기본순위&"-"&동그룹-정렬 총점(B열) 동점 내에서 과목점수(C열)가 큰 순서로 1,2,3을 부여해 1위-1, 1위-2 형태로 표기한다.
4.2 가중 조합 점수로 단일 지표화
보조 지표를 가중합으로 단일 지표로 만든 뒤 RANK.EQ로 처리한다.
=RANK.EQ( $B2*100000 + $C2*100 + (100-$D2), $B$2:$B$100*100000 + $C$2:$C$100*100 + (100-$D$2:$D$100), 0 ) 가중 배수는 값 범위가 겹치지 않도록 충분히 크게 잡는다. D열이 패널티(작을수록 우수)라면 역방향을 위해 100에서 빼서 합산한다.
5. 숨김행·필터 적용 데이터만 랭크하기
일부 행을 필터로 숨긴 상태에서 보이는 데이터만 순위를 매기려면 FILTER와 RANK를 결합한다.
가시범위: =FILTER($B$2:$B$100, SUBTOTAL(103, OFFSET($B$2, ROW($B$2:$B$100)-ROW($B$2), 0))) 조밀랭크: =MATCH(B2, SORT(UNIQUE(가시범위),,-1), 0) SUBTOTAL 함수의 103은 COUNTA와 동일하나 숨김행을 무시한다.
6. 숫자/텍스트 혼재·빈셀·에러값 처리
6.1 숫자로 강제 변환
정상화: =IF($B2="", "", --$B2) 이중 단항 연산자(--)로 텍스트 숫자를 강제로 숫자로 변환한다. 날짜·시간도 일관 포맷을 적용한다.
6.2 에러값 무시하고 랭크
=LET( rng, IFERROR($B$2:$B$100, NA()), v, IFERROR(B2, NA()), IF( ISNA(v), "", RANK.EQ(v, FILTER(rng, ISNUMBER(rng)), 0) ) ) ISNUMBER로 숫자만 남겨 랭크한다. 해당 셀이 에러면 공란 처리한다.
6.3 공백 제외 평균순위
=IF(B2="","", RANK.AVG(B2, FILTER($B$2:$B$100, $B$2:$B$100<>""), 0)) 빈셀을 제외한 값만 대상으로 평균순위를 계산한다.
7. 대량 데이터에서의 성능 최적화
- 동적 배열을 1회만 계산하고 참조 범위를 고정한 뒤 XLOOKUP으로 순위 매핑을 권장한다.
- 揷入행이 잦다면 구조화 참조(테이블)를 사용해 참조 자동 확장을 확보한다.
- 揷入열을 줄이려면 LET로 이름 있는 지역 변수를 선언해 범위 중복 계산을 제거한다.
=LET( src, Table1[점수], uniq, SORT(UNIQUE(src),,-1), rank_map, SEQUENCE(ROWS(uniq)), XLOOKUP([@점수], uniq, rank_map) ) 8. 조밀 순위와 경쟁 순위의 합 일치성 검증
인사·보상에서 순위 총합을 검증하려면 조밀 순위와 경쟁 순위의 통계적 차이를 이해해야 한다.
- 경쟁 순위: 동점 규모만큼 다음 순위를 건너뛴다. 총합이 커진다.
- 조밀 순위: 건너뛰지 않는다. 총합은 고유 값 개수의 삼각수 합과 연관된다.
분석 보고서에는 동점 빈도 분포, 누적 인원 대비 순위 분포 그래프, 보정 방식 선택 근거를 명시한다.
9. 실무 시나리오별 베스트 프랙티스
9.1 성과 평가: 동순위 허용, 조밀 랭크 표기
인원수 기준으로 상위 몇 퍼센트를 분할할 때 조밀 랭크가 배분에 유리하다.
=MATCH([@총점], SORT(UNIQUE(Table1[총점]),,-1), 0) 9.2 대회 성적: 경쟁 순위 고수, 세부 타이브레이커 병기
종목 규정에 따라 동점 허용이나 2차 기준을 병기한다.
기본: =RANK.EQ([@기록], Table1[기록], 1) 타이: =COUNTIFS(Table1[기록], [@기록], Table1[세부], "<"&[@세부]) + 1 표시: =기본&"("&타이&")" 9.3 판매 실적: 평균순위로 팀 간 형평성 보정
지점별 시장 규모 차이가 클 때 평균순위가 지표 왜곡을 완화한다.
10. 다중 기준 순위의 안정화 공식(완성형)
총점, 1차 타이브레이커, 2차 타이브레이커까지 반영한 최종 순위를 하나의 공식으로 작성한다.
=LET( score, $B$2:$B$100, tie1, $C$2:$C$100, tie2, $D$2:$D$100, key, HSTACK(score, tie1, tie2), uniq, DROP(UNIQUE(SORTBY(key, score, -1, tie1, -1, tie2, -1)),,1), target, HSTACK(B2, C2, D2), MATCH(target, uniq, 0) ) HSTACK 키를 내림차순으로 정렬한 뒤 UNIQUE로 고유 조합만 남기고 MATCH로 위치를 찾으면 완전한 조밀 순위가 된다.
11. Power Query·모델 기반 계산과의 연계
대용량 데이터는 PQ에서 숫자 형식 강제, Null 제거, 에러 변환을 선처리한 뒤 워크시트에서 랭크를 계산한다. Power Pivot에서는 DAX의 RANKX로 같은 원리를 확장하며, 동점자 처리 옵션과 정렬 컬럼을 명시해 모델 일관성을 확보한다.
12. 표시·보고 품질 관리
- 표시 형식: 1위, 2위처럼 서수 표기를 사용자 지정 서식으로 구현한다.
- 동점 표기 규칙: 문서 첫머리에 경쟁·평균·조밀 중 선택 근거를 명문화한다.
- 감사 추적: 계산 범위, 버전, 데이터 스냅샷 일자를 표에 포함한다.
사용자 지정: 0"위" 13. 자주 발생하는 실수와 예방 팁
- 참조 범위를 혼합참조로 고정하지 않아 행 복사 시 범위가 이동한다. $기호로 고정한다.
- 숫자 비교 방향을 혼동한다. 기록 시간은 오름차순, 점수는 내림차순이다.
- 정렬 후 랭크를 재계산하지 않아 보고서와 소스가 불일치한다. 계산 업데이트를 강제한다.
14. 예제 데이터와 종합 솔루션
| 이름 | 총점(B) | 과목점수(C) | 패널티(D) |
|---|---|---|---|
| A | 95 | 88 | 2 |
| B | 95 | 84 | 1 |
| C | 90 | 90 | 0 |
| D | 90 | 85 | 3 |
| E | 88 | 70 | 2 |
경쟁 순위:
=RANK.EQ(B2, $B$2:$B$6, 0) 조밀 순위:
=MATCH(B2, SORT(UNIQUE($B$2:$B$6),,-1), 0) 경쟁 순위 + 타이브레이커 표기:
기본: =RANK.EQ(B2, $B$2:$B$6, 0) 내부: =COUNTIFS($B$2:$B$6, B2, $C$2:$C$6, ">"&C2) + 1 표시: =기본&"-"&내부 완전 결정 순위(가중 조합):
=RANK.EQ(B2*100000 + C2*100 + (100-D2), $B$2:$B$6*100000 + $C$2:$C$6*100 + (100-$D$2:$D$6), 0) 15. 버전 호환성과 함수 대체 전략
- Excel 2010 미만: RANK 사용 가능하나 문서에 동작 정의를 명시한다.
- Excel 2019 미만: UNIQUE·SORT 미지원이다. 보조열 또는 피벗테이블로 대체한다.
- Microsoft 365: LET·LAMBDA로 재사용 가능한 사용자 정의 랭크 함수를 만든다.
=LAMBDA(arr, x, MATCH(x, SORT(UNIQUE(arr),,-1), 0)) 16. 감사·재현 가능성 확보 체크리스트
- 데이터 스냅샷 시점과 파일 해시를 기록한다.
- 순위 규칙, 동점자 처리 방식, 예외 규칙을 문서 첫 페이지에 고정한다.
- 모든 공식은 명명된 범위로 추상화하고 주석을 남긴다.
FAQ
동점자에 서로 다른 순위를 강제로 부여하려면 어떻게 하나?
COUNTIFS로 동점 그룹 내 2차 지표 우위 개수를 세어 고유한 정렬 번호를 붙인 뒤, 기본 순위와 결합해 표시하거나 가중 조합 점수를 사용해 단일 RANK.EQ로 처리하면 된다.
반드시 정수 순위만 필요할 때는 어떻게 하나?
조밀 랭크를 사용하면 건너뛰는 순위가 없어 정수 연속 순위가 된다. MATCH(SORT(UNIQUE())) 조합을 권장한다.
필터로 보이는 데이터만 순위를 매길 수 있나?
SUBTOTAL과 FILTER를 결합한 가시범위 배열을 만들고 그 배열을 기준으로 RANK 또는 MATCH를 적용하면 가능하다.
RANK.AVG 결과의 소수 표시를 제거하려면?
ROUND로 반올림하거나 INT로 버림 처리한다. 단, 평균순위의 통계적 의미가 변하므로 보고서에 처리 규칙을 명시해야 한다.
텍스트 숫자 때문에 순위가 잘못될 때 빠른 해결법은?
--B2 또는 VALUE(B2)로 숫자 강제 변환 보조열을 만든 뒤 그 열을 대상으로 RANK를 적용한다.