(MySql) 그룹별로 상위 점수 10명씩 추출하고 싶습니다. 0 3 655

by 훈미남 [MySQL] [2018.06.12 16:24:17]


안녕하세요. 선배님께 질문을 드려 답을 얻고자 합니다.
도움 주시면 감사하겠습니다.

그룹/이름/점수 가 들어있는 A 테이블이 있는데요,
그룹별로 상위 점수 10명씩 추출하고 싶습니다.
sql 문 도움 주시면 감사하겠습니다.

 

현재 데이터

테이블명 A  ( DB는 MySql 입니다. )
-----------------------------
group   name    score       그룹    이름   점수 입니다.
--------------------
1그룹   홍길동   92
1그룹   김철수   83
1그룹   오영희   28
1그룹   제임스   91
1그룹   이순신   100
1그룹   오영희   28
1그룹   나마다   38
1그룹   송승한   78
.        .        .
.        .        .
.        .        .
.        .        .
2그룹   최진     74
2그룹   송해     83
2그룹   진성준   50
2그룹   강재도   62
2그룹   나문희   51
2그룹   도도한   42
2그룹   나이쁨   29
2그룹   한라산   88
.        .        .
.        .        .
.        .        .
.        .        .
3그룹   오사랑   98
3그룹   전진     37
3그룹   사랑해   85
3그룹   황바람   49
3그룹   오바람   93
3그룹   셀린느   63
3그룹   나나     87
.        .        .
.        .        .
.        .        .
.        .        .

 

 

얻고 싶은 결과 값

-----------------------------
group   name    score 
--------------------
1그룹   이순신   100
1그룹   홍길동   92
1그룹   제임스   91
1그룹   김철수   83
1그룹   송승한   78
6~10 등까지

2그룹   한라산   88
2그룹   송해     83
2그룹   최진     74
2그룹   강재도   62
2그룹   나문희   51
2그룹   진성준   50
6~10 등까지

3그룹   오사랑   98
3그룹   오바람   93
3그룹   나나     87
3그룹   사랑해   85
3그룹   셀린느   63
6~10 등까지
 

by 마농 [2018.06.12 17:27:52]
-- 동점 처리를 위해 name 으로 정렬했습니다.(동점자 name ASC 우선)
-- 1. 셀프조인후 카운트를 이용하는 방법
SELECT a.grp, a.name, a.score
     , COUNT(b.grp) + 1 rn
  FROM test3 a
  LEFT OUTER JOIN test3 b
    ON a.grp = b.grp
   AND ( a.score < b.score OR
       ( a.score = b.score AND a.name > b.name)
       )
 GROUP BY a.grp, a.name, a.score
HAVING COUNT(b.grp) + 1 <= 10
 ORDER BY grp, rn
;
-- 2. 변수를 이용하는 방법
SELECT grp, name, score, rn
  FROM (SELECT grp, name, score
             , @rn := CASE WHEN @grp = grp THEN @rn + 1 ELSE 1 END rn
             , @grp := grp
          FROM test3 a
             , (SELECT @grp := '', @rn := 0) b
         ORDER BY grp, score DESC, name
        ) a
 WHERE rn <= 10
;

 


by 훈미남 [2018.06.12 17:37:06]

전에도 답변 주셨는데, 시간 내어주셔서 감사합니다. 외근중이라 밤 늦게 확인하고 혹시나 어려움 있으면 질문 드리겠습니다.


by 훈미남 [2018.06.13 00:32:58]

회사 들어와서 확인 했습니다.

1번째 셀프조인은 데이터(8만건)가 많아 로드가 많이 걸려서

2번째로 적용하여 해결 하였습니다.

감사합니다.

 

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