Mysql에서 rank 구하기 (2단계) 0 3 2,678

by 농부지기 [2017.01.16 13:55:01]


저번주에 Rank 구하는 방법을 마농님이 알려주셔서 개발 했었는데요.
아쉽게도 한가지 더 요건정의가 있었네요.
팀별 등수가 필요해서요.
팀인원은 2명,3명,4명...  달라질 수 있구요.
즉, 팀별 점수는 동일 하구요. 팀별 등수도 동일하게 나와야 되는거죠.
부탁 드립니다.
-------------------------------------------
반 :   이름      : 팀명   :   점수    : 등수
-------------------------------------------
1반   강감찬      A        100        1
1반   차명이      A        100        1

1반   이순신      B          96         2
1반   골동품      B          96         2

1반   홍길동      C          96         2
1반   결사대      C          96         2

1반   김유신      D          90         4
1반   김유신      D          90         4

-------------------------------------------
2반   말똥고리   A        80        1
2반   구리구리   A        80        1
2반   마리마리   A        80        1

2반   장수말벌   B         70       2
2반   벌똥말똥   B         70       2
2반   쉬벌버벌   B         70       2

2반    꿀벌        C        60        3
2반    말벌        C        60        3
2반    쇠벌        C        60        3

2반     나비       D         60       3
2반     너비       D         60       3
2반     고비       D         60       3

-------------------------------------------------------


[이전 답변]- 팀이 빠진 등수구하기

-- 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.16 17:15:05]

마농님이 어제 답변으로 오늘 고생끝에 아래 sql문장을 완성했습니다.
이제 mysql서버에 대해 변수사용방법을 조금 느껴졌네요.
이 느낌으로 mysql이 얼마나 대단한지(?)도 알게 되었구요.
무료라서 싸구려(^^)로 생각했는데 전혀 아니였네요.
변수사용방법만 알고 있으면 정말로 놀라운 sql문장을 만들수도 있네요.

오늘부터 mysql 신봉자가 되렵니다.

  SELECT a.game_part_cd, a.enter_team, a.orgn_cd, a.player_seq, a.part_rope_cnt
       , @rn  := CASE WHEN @part != a.game_part_cd 
                           THEN 1
                           ELSE (CASE WHEN @cnt = a.part_rope_cnt THEN @rn + 0 ELSE @rn + 1 + @same END)
                  END rank
       , @same := CASE WHEN @cnt = a.part_rope_cnt AND (@orgn != a.orgn_cd OR @part != a.game_part_cd OR @team != a.enter_team)
                       THEN @same + 1 
                       ELSE (CASE WHEN @same > 0 AND @cnt = a.part_rope_cnt THEN @same ELSE 0 END)
                  END AS same
       , @orgn := a.orgn_cd
       , @part := a.game_part_cd
       , @team := a.enter_team
       , @cnt  := a.part_rope_cnt
                             
    FROM (SELECT pl.orgn_cd, a.player_seq, a.game_part_cd, a.part_rope_cnt , a.enter_team
            FROM hanjul.TPlayerInGame a INNER JOIN hanjul.TPlayer pl
                 ON (    a.contest_yy = pl.contest_yy
                     AND a.contest_seq = pl.contest_seq
                     AND a.player_seq  = pl.player_seq )
           WHERE a.contest_yy    = '2016'
             AND a.contest_seq   = 11
             AND a.game_cd       = '0080' -- 0080  0010
             AND a.part_rope_cnt > 0
          ORDER BY a.game_part_cd ASC, a.part_rope_cnt DESC, a.player_seq) a
       , (SELECT @part := '', @cnt := 0, @rn := 0, @same := 0) b

 

 

 


by 마농 [2017.01.18 10:12:53]

정렬 조건에 팀이 빠져 있네요?

  결과가 잘 나왔다면? player_seq 순서대로 팀이 짜여진 모양이죠?

  동점인 B 팀과 C 팀이 뒤섞이지 않도록 팀 정렬 필요합니다.

orgn_cd 또한 랭킹 구하는데 역할을 하는 듯 하네요?

  랭킹 구하는데 필요한 항목들이 모두 정렬조건에 들어가야 합니다.

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