하는 일/데이터엔지니어링
[ MySQL 쿼리 기초 ] 랭킹 그룹화
yeznable
2024. 10. 22. 10:52
728x90
전공자가 아닌 내가 일하면서 배운 쿼리 기초를 찾아보기 쉽도록 남긴다.
[ 필요성 ]
게임에 새로운 컨텐츠가 생겼고 이에 따른 신규 지표 기획을 받았다.
랭킹 관련 컨텐츠였는데 지표에서는 모든 랭킹을 보고싶어하지는 않고 랭킹 그룹을 지어서 보고싶어 했다.
예를 들어서 1위 부터 5위 까지는 실제 랭커의 데이터를 보고 그 이후로는 6~10위를 통합해서, 11~20위를 통합해서 보고 그 이후 21위 이후인 랭커는 한꺼번에 평균 내서 보고싶다는 식이다.

[ 구조 ]
2가지 테이블을 조인해서 구현하는 팁을 배웠다.
첫번째 테이블은 랭커별 정보가 집계된 테이블이다.
해당 테이블에는 랭크 그룹이 지어지기 전 각 랭커의 데이터가 집계된 결과가 있다.
총 랭커 수가 1,000명이라면 1등부터 1,000등까지의 랭커 데이터를 모두 보유한다.
두번째 테이블은 랭크 그룹이 정의된 테이블이다.
해당 테이블은 지표에서 보여질 그룹명(rnk_group), 랭크 그룹의 시작값(from_rnk), 랭크 그룹의 끝값(to_rnk), 정렬값(sort_no), 어떤 지표에서 쓰일지 구분값(type)을 가진 테이블이다.

[ 활용 ]
이렇게 랭커별 정보 테이블과 랭크 그룹이 정의된 테이블이 있다면 다음과 같은 쿼리로 랭크 그룹별로 집계된 지표를 보여줄 수 있다.
SELECT CONCAT(B.rnk_group,'등') AS '등수'
, ROUND(AVG(A.teampoint),0) AS '팀 포인트'
FROM table_ranker A
LEFT OUTER JOIN table_rankGroup B
ON A.rnk >= B.from_rnk
AND A.rnk <= B.to_rnk
and B.type='teamrank_point'
GROUP BY B.rnk_group
ORDER BY B.sort_no
;
728x90