안녕하세요. 선배님께 질문을 드려 답을 얻고자 합니다.
도움 주시면 감사하겠습니다.
그룹/이름/점수 가 들어있는 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 등까지
-- 동점 처리를 위해 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 ;