[HackerRank lv4] SQL문제풀이 - Contest Leaderboard

데프·2023년 11월 24일
0

SQL문제풀이

목록 보기
4/7

👉 문제 바로가기(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에는 답안들이 많이 공유되지 않는다. 안타깝지만 그리 복잡한 문제는 아니므로 이정도로 하고 넘어가도 될 듯 하다.

profile
정보의 홍수를 기록하는 데프의 로그

0개의 댓글

관련 채용 정보