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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | -- 1. Self Join 을 이용하여 등수 구하기 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 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |