mysql (rank을 구하고 싶은데요. 문제는 동일등수가 있다는게..) 0 5 2,166

by 농부지기 [MySQL] [2017.01.13 15:54:26]


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 하려니 적응이 잘 안되네요.

고수님 부탁 합니다.

 

by 마농 [2017.01.13 16:40:01]
-- 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
;

 


by 농부지기 [2017.01.13 17:23:25]

마농님 한번더요.

변수를 이용해서 하니 속도가 장난아니게 빠르네요. ^^

그런데 문제가...
이상하게 점수가 낮은게 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

 


by 마농 [2017.01.13 17:38:35]

글쎄요?

인라인뷰 안의 정렬결과는 잘 나오나요?

마지막 Order By 는 왜 하나요?  <-- 이것 때문인 듯 하네요.


by 농부지기 [2017.01.13 17:46:36]

그러네요.

order by를 빼니 잘 되네요.
전, 나온 결과를 정렬하고 싶었는데요.....

마지막 order by는   rank 가 다 부여된 후에  order by절이 실행 되는게 아니였나요?

 


by jkson [2017.01.13 18:26:09]

변수를 이용하여 등수 구하기 -> 오~~ 이건 무슨 원리인가용?

SELECT로 한 번 더 감싸고 ORDER BY 해도 안 되나요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입