👉 문제 바로가기(HackerRank)
Question.
# 해커의total_score
는 모든challenge
의 최고점수max(score)
의 합이다
#hacker_id
,name
,total_score
를 출력하라
# order by score desc, hacker_id asc
#total_score
가 0인 것은 결과에서 제외하라
해커랭크 상에서 medium 난이도의 문제이다.
주관적으로 매긴 난이도 lv4 는 좀 많이 준 감도 있으나
프로그래머스 lv3의 평균적인 난이도로 봤을 때 그보다는 높다고 판단했다.
group by의 개념만 있다면 다소 sql에 다소 서툰 사람이라도 결과를 얻어낼 수 있을 것으로 보인다.
select
hacker_id
, name
, sum(max_score) total_score
from (
select
h.hacker_id
, h.name
, s.challenge_id
, max(s.score) max_score
from
hackers h
, submissions s
where
h.hacker_id = s.hacker_id
group by
h.hacker_id
, h.name
, s.challenge_id
having max(s.score) > 0
) t
group by
hacker_id
, name
order by
3 desc
, 1 asc
;
내부 서브쿼리의 결과는 해커가 각 챌린지에서 제일 높게 얻은 점수 목록이다.
그것을 서브쿼리 밖에서 합하면 문제가 요구하는 답을 얻을 수 있다.
뭔가 window sort를 능숙하게 쓴다면 서브쿼리 없이 끝낼 수 있을 듯 하다.
(하지만 꼭 그럴 필요가 있는 복잡한 쿼리는 아니다.)
select
hacker_id
, name
, sum(max_score) total_score
from
hackers h
join (
select
s.hacker_id
, s.challenge_id
, max(s.score) max_score
from
submissions s
group by
s.hacker_id
, s.challenge_id
having
max(s.score) > 0
) t on h.hacker_id = t.hacker_id
group by
hacker_id
, name
order by
3 desc,
1 asc;
join의 형태가 명시적으로 바뀐것은 신경쓰지 말고,
서브쿼리 내부에서 hacker테이블을 밖으로 빼내었다.
결과적으로 group by 조건이 하나 줄었다.
사소해보일 수 있지만 group by 조건이 늘수록 index활용성은 계속 줄어든다.
줄일수록 이득👍이라는 말씀!
window sort를 야무지게 활용한 예제를 찾고 싶었는데 hackerrank에는 답안들이 많이 공유되지 않는다. 안타깝지만 그리 복잡한 문제는 아니므로 이정도로 하고 넘어가도 될 듯 하다.