데이터베이스에서 랭크와 백분위를 계산하는 것은 데이터 분석에서 매우 중요한 작업입니다. MySQL은 이러한 작업을 수행하기 위한 다양한 기능을 제공합니다. 이 글에서는 MySQL에서 랭크와 백분위를 계산하기 위한 10가지 쿼리 예제를 소개하고, 이를 활용할 수 있는 실용적인 팁과 사례를 제시합니다.
1. 기본적인 RANK() 함수 사용법
RANK() 함수는 주어진 데이터 집합에서 각 행의 순위를 매기는 데 사용됩니다. 다음 예제는 학생들의 성적에 기반하여 순위를 매기는 쿼리입니다.
SELECT name, score,
RANK() OVER (ORDER BY score DESC) AS rank
FROM students;
이 쿼리는 성적이 높은 순서로 학생들에게 순위를 매깁니다.
2. DENSE_RANK() 함수 사용법
DENSE_RANK() 함수는 동일한 값을 가진 행들에게 동일한 순위를 부여하되, 다음 순위는 건너뛰지 않는 방식입니다.
SELECT name, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM students;
이 쿼리는 성적이 동점인 학생들에게 동일한 순위를 주고, 다음 순위는 순차적으로 이어집니다.
3. NTILE() 함수로 그룹화하기
NTILE() 함수는 데이터 집합을 지정된 수의 그룹으로 나누는 데 유용합니다. 예를 들어, 상위 4개의 그룹으로 나누는 쿼리입니다.
SELECT name, score,
NTILE(4) OVER (ORDER BY score DESC) AS quartile
FROM students;
이 쿼리는 학생들을 4개의 사분위수로 나누어 각 학생이 속한 그룹을 나타냅니다.
4. 백분위 계산하기
백분위는 특정 값이 전체 데이터에서 얼마나 높은지를 나타내는 데 사용됩니다. 다음 쿼리는 학생들의 성적 백분위를 계산합니다.
SELECT name, score,
100 * (SELECT COUNT(*) FROM students s2 WHERE s2.score <= s1.score) / COUNT(*) AS percentile
FROM students s1;
이 쿼리는 각 학생의 성적이 전체 학생 대비 몇 퍼센트에 해당하는지를 계산합니다.
5. ROW_NUMBER() 함수 사용하기
ROW_NUMBER() 함수는 데이터 집합 내에서 고유한 순번을 부여합니다. 다음은 학생들에게 고유한 번호를 부여하는 쿼리입니다.
SELECT name, score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num
FROM students;
이 쿼리는 각 학생에게 고유한 행 번호를 할당합니다.
6. PARTITION BY를 이용한 그룹 내 랭크
PARTITION BY 절을 사용하면 데이터 집합을 특정 기준으로 나눈 후 랭크를 매길 수 있습니다. 예를 들어, 학년별로 학생들을 나누어 순위를 매기는 방법입니다.
SELECT name, score, grade,
RANK() OVER (PARTITION BY grade ORDER BY score DESC) AS rank
FROM students;
이 쿼리는 각 학년 내에서 학생들의 순위를 매깁니다.
7. SUM()과 RANK()를 함께 사용하기
SUM() 함수와 RANK() 함수를 함께 사용하여 합계와 순위를 동시에 계산할 수 있습니다.
SELECT name, score,
SUM(score) OVER () AS total_score,
RANK() OVER (ORDER BY score DESC) AS rank
FROM students;
이 쿼리는 각 학생의 성적 합계와 함께 순위를 보여줍니다.
8. GROUP BY와 RANK() 결합하기
GROUP BY 절과 RANK() 함수를 결합하면 각 그룹 내에서의 순위를 쉽게 계산할 수 있습니다.
SELECT grade, AVG(score) AS avg_score,
RANK() OVER (ORDER BY AVG(score) DESC) AS rank
FROM students
GROUP BY grade;
이 쿼리는 각 학년의 평균 성적과 순위를 계산합니다.
9. 서브쿼리에서 백분위 계산하기
서브쿼리를 활용하여 더욱 복잡한 백분위 계산을 수행할 수 있습니다.
SELECT name, score,
(SELECT COUNT(*) FROM students WHERE score <= s.score) * 100.0 / COUNT(*) AS percentile
FROM students s;
이 쿼리는 각 학생의 성적 백분위를 서브쿼리를 통해 계산합니다.
10. CTE(Common Table Expression)와 함께 사용하기
CTE를 사용하면 쿼리를 더욱 깔끔하게 작성할 수 있습니다. 다음은 CTE와 RANK()를 사용하는 예제입니다.
WITH RankedScores AS (
SELECT name, score,
RANK() OVER (ORDER BY score DESC) AS rank
FROM students
)
SELECT * FROM RankedScores;
CTE를 사용하면 쿼리의 가독성을 높이고, 필요한 데이터를 손쉽게 다룰 수 있습니다.
사례 연구
사례 1: 학생 성적 분석
한 교육 기관에서는 학생들의 성적을 분석하기 위해 MySQL을 활용했습니다. 학생 데이터는 이름, 성적, 학년으로 구성되어 있습니다. 기관은 학생들의 성적을 바탕으로 각 학생의 랭크와 백분위를 계산하고, 이를 통해 성적 향상 방안을 마련하고자 했습니다.
위에서 설명한 RANK()와 DENSE_RANK() 함수를 활용하여 성적을 분석하고, 각 학년별 평균 성적을 구하기 위해 GROUP BY와 RANK()를 결합한 쿼리를 작성했습니다. 결과는 다음과 같습니다:
학년 | 평균 성적 | 순위 |
---|---|---|
1학년 | 85 | 1 |
2학년 | 78 | 2 |
3학년 | 82 | 3 |
이 데이터를 통해 교육 기관은 각 학년의 성적 분포를 이해하고, 필요한 학습 자료를 준비할 수 있었습니다.
사례 2: 직원 성과 평가
한 기업에서는 직원들의 성과를 평가하기 위해 MySQL을 사용하였습니다. 직원 데이터는 이름, 성과 점수로 구성되어 있습니다. 이 기업은 성과 점수를 기준으로 직원들의 순위를 매기고, 우수 직원을 선정하기 위해 백분위를 계산했습니다.
이 기업은 ROW_NUMBER()와 RANK()를 함께 사용하여 각 직원의 성과를 평가하였고, 다음과 같은 결과를 얻었습니다:
이름 | 성과 점수 | 순위 | 백분위 |
---|---|---|---|
김철수 | 95 | 1 | 100% |
이영희 | 90 | 2 | 97% |
박민수 | 85 | 3 | 93% |
이 정보를 통해 기업은 우수한 성과를 낸 직원에게 인센티브를 제공하고, 향후 인사 전략을 수립할 수 있었습니다.
사례 3: 스포츠 팀 성적 분석
스포츠 팀에서는 선수들의 성적을 분석하기 위해 MySQL을 활용했습니다. 선수 데이터는 이름, 경기 수, 득점으로 구성되어 있습니다. 이 팀은 각 선수가 시즌 동안의 평균 득점을 기준으로 순위를 매기고, 이를 통해 팀 전략을 개선하고자 했습니다.
팀은 AVG()와 RANK()를 결합하여 각 선수의 평균 득점 순위를 구한 결과는 다음과 같습니다:
이름 | 경기 수 | 총 득점 | 평균 득점 | 순위 |
---|---|---|---|---|
홍길동 | 10 | 250 | 25 | 1 |