SQL 코딩테스트 준비를 위해 해커랭크 문제풀이를 해보려고 합니다. 서버는 MySQL을 기준으로 설정하였으며, 문제의 핵심은 sql에서 어떤 join을 사용할 것인지, having, order by 조건을 정확히 사용할 수 있는지를 이해하는 것입니다. SQL 코딩 능력을 키우고자 하는 분들에게 도움이 될 수 있도록 문제 해결에 필요한 사고 과정과 코드 설명을 상세히 다루었습니다.
퐈이어 🔥
문제 : Top Competitors (hackerrank sql, mysql)
난이도 : Medium
서버 : MySQL
테이블 이름 : 총 5개,
(1) Hackers
(2) Difficulty
(3) Challenges
(4) Submissions
- 문제 의도 : JOIN 무엇을 사용할 것인지, HAVING, ORDER BY 조건을 정확히 사용할 수 있는지
https://www.hackerrank.com/challenges/full-score/problem?isFullScreen=true
문제 요약 :
추출 : hacker id, name
추출 조건 : 2번 이상 챌린지한 hacker name만, difficulty 테이블에 있는 10단위의 score만
정렬 조건 : 챌린지 횟수 구해서 내림차순, hacker_id 오름차순
input sample
output sample
정답 SQL 코드 :
SELECT
h.hacker_id,
h.name
FROM
Hackers h
JOIN
Submissions s ON h.hacker_id = s.hacker_id
JOIN
Challenges c ON s.challenge_id = c.challenge_id
JOIN
Difficulty d ON c.difficulty_level = d.difficulty_level
WHERE
s.score = d.score
GROUP BY
h.hacker_id, h.name
HAVING
COUNT(DISTINCT c.challenge_id) > 1
ORDER BY
count(c.challenge_id) DESC,
h.hacker_id ASC;
풀이과정 :
(나의 풀이 사고과정 정리- 회고록)
일단 잘못 이해한 부분이 있었다.
추출 : hacker id, name
추출 조건 : 2번 이상 챌린지한 hacker name만
-> 여기서 Full score 조건도 있었는데, 예시 데이터에서 90411 Joe만 있어서
이때, Joe의 score가 100점이라
full score의 의미를 100점으로 잘못 이해했다.
order 조건 : total number of challenge(챌린지 횟수) desc hacker_id asc
그래서, 다음과 같이 쿼리를 작성했었다.
<Wrong answer query>
SELECT s.hacker_id,
h.name,
COUNT(DISTINCT h.name) as total_number_of_challenges
FROM Submissions s
JOIN Challenges c ON s.hacker_id = c.hacker_id
JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
JOIN Hakcers h ON s.hacker_id = h.hacker_id
WHERE s.score = 100
GROUP BY s.hacker_id, h.name
HAVING count(h.name) > 1
ORDER BY total_number_of_chalenges desc, hacker_id asc
이후 나는 2가지를 수정했다.
(1) full score의 의미는, Difficulty table의 score 10단위들을 말하는데,
submissions score에는 35, 77 등 10단위 점수가 아닌 것도 있었다.
WHERE s.score = d.score
(2) 조건 중 HAVING절 수정, 더 정확히 challenge 1번 이상 조건으로 변경
HAVING count(h.name) > HAVING count(c.challenge_id)
따라서, 다음과 같은 코드를 실행하면 정답!
SELECT
h.hacker_id,
h.name
FROM
Hackers h
JOIN
Submissions s ON h.hacker_id = s.hacker_id
JOIN
Challenges c ON s.challenge_id = c.challenge_id
JOIN
Difficulty d ON c.difficulty_level = d.difficulty_level
WHERE
s.score = d.score
GROUP BY
h.hacker_id, h.name
HAVING
COUNT(DISTINCT c.challenge_id) > 1
ORDER BY
count(c.challenge_id) DESC,
h.hacker_id ASC;
[코딩테스트] Hackerrank SQL Weather Observation Station 18 해커랭크 문제
'SQL 데이터 분석' 카테고리의 다른 글
[코딩테스트] 해커랭크 Hackerrank SQL Ollivander's Inventory 문제풀이 (0) | 2024.10.30 |
---|---|
[인프런 빅쿼리 빠짝스터디 1주차] SQL 스터디 제품현황 분석 : 퍼널분석, PIVOT, ARRAY, STRUCT, UNNEST (2) | 2024.10.27 |
[코딩테스트] Hackerrank SQL Weather Observation Station 18 해커랭크 문제풀이 (0) | 2024.10.24 |
[코딩테스트] 해커랭크 Hackerrank SQL New Companies 문제풀이 (0) | 2024.10.22 |
[코딩테스트] 해커랭크 Hackerrank SQL Binary Tree Nodes 문제풀이 (1) | 2024.10.22 |