Mysql에서 rank를 구하려니 많이 어렵네요.
단순 rank에 대한 설명은 많은데요. 전 그룹별로 동일 rank가 존재 해야 되거든요.
반 : 이름 : 점수 : 등수
1반 강감찬 100 1
1반 이순신 96 2
1반 홍길동 96 2
1반 김유신 90 4
-----------------------------------
2반 말똥고리 80 1
2반 장수말벌 70 2
2반 꿀벌 60 3
2반 나비 60 3
-------------------------------------------------------
Oracle만 하다가 Mysql 하려니 적응이 잘 안되네요.
고수님 부탁 합니다.
-- 1. Self Join 을 이용하여 등수 구하기 -- http://www.gurubee.net/lecture/2192 SELECT a.gb, a.nm, a.jum , COUNT(b.gb) + 1 rk FROM table a LEFT OUTER JOIN table b ON a.gb = b.gb AND a.jum < b.jum GROUP BY a.gb, a.nm, a.jum ORDER BY gb, rk, nm ; -- 2. 변수를 이용하여 등수 구하기 SELECT gb, nm, jum , @rn := CASE WHEN @gb != gb THEN 1 ELSE @rn + 1 END rn , @rk := CASE WHEN @rn = 1 THEN 1 ELSE CASE WHEN @jum = jum THEN @rk ELSE @rn END END rk , @gb := gb , @jum := jum FROM (SELECT gb, nm, jum FROM table ORDER BY gb, jum DESC, nm) a , (SELECT @gb := '', @jum := 0, @rn := 0, @rk = 0) b ;
마농님 한번더요.
변수를 이용해서 하니 속도가 장난아니게 빠르네요. ^^
그런데 문제가...
이상하게 점수가 낮은게 1 등으로 나오네요. 제가 뭘 잘못했을까요?
(첫번째 방법으로 하면 정상적이기는 한데, 속도가 조금 걸리네요. 그래서 두번째 방법으로..)
nm : player_seq
gb : game_part_cd 입니다.
SELECT a.game_part_cd, a.player_seq, a.part_rope_cnt , @rn := CASE WHEN @gb != a.game_part_cd THEN 1 ELSE @rn + 1 END rn , @rk := CASE WHEN @rn = 1 THEN 1 ELSE CASE WHEN @jum = a.part_rope_cnt THEN @rk ELSE @rn END END rk , @gb := a.game_part_cd , @jum := a.part_rope_cnt FROM (SELECT a.player_seq, a.game_part_cd, a.part_rope_cnt FROM hanjul.TPlayerInGame a WHERE a.contest_yy = '2016' AND a.contest_seq = 11 AND a.game_cd = '0010' AND a.part_rope_cnt > 0 ORDER BY a.game_part_cd ASC, a.part_rope_cnt DESC) a , (SELECT @gb := '', @jum := 0, @rn := 0, @rk = 0) b ORDER BY a.game_part_cd, 3