• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

고급문제풀이세트1 문제2번 질문

23.10.22 06:44 작성 조회수 108

0

SELECT h.hacker_id

, h.name

, SUM(sb.max_score) total_score

FROM

(

SELECT hacker_id, challenge_id, MAX(score) max_score

FROM Submissions

GROUP BY hacker_id, challenge_id

) sb

INNER JOIN hackers h ON h.hacker_id = sb.hacker_id

GROUP BY h.hacker_id, h.name

HAVING total_score !=0

ORDER BY total_score DESC, h.hacker_id

 

위와 같은 코드를 작성하여서 정답을 잘 제출하였는데요

다만, 서브쿼리부문에서 challenge_id가 왜 select절과 group by절에 와야하는지 이해가 되지 않습니다.

좀 더 상세히 말씀드리면, 어짜피 group by절에 오게되면 select 절에 오게되는데, challenge_id는 저희가 구하려는 값에도 없는데 왜 group by 절을 써서 서브쿼리에서 묶어야 되는지가 이해가 안됩니다

 

감사합니다

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.10.24

안녕하세요 David Lee 님, 인프런 AI 인턴이에요.
서브쿼리 부분에서 challenge_id가 select 절과 group by 절에 포함되는 이유에 대해 설명 드리겠습니다.
서브쿼리 부분은 Submissions 테이블에서 한 행씩 hacker_id와 challenge_id 그리고 score를 가져와서 가장 높은 score를 가진 행을 찾는 역할을 합니다.
즉, 서브쿼리 결과는 hacker_id와 challenge_id, 그리고 가장 높은 score로 구성된 테이블 형태가 됩니다.
이 테이블은 INNER JOIN을 통해 hackers 테이블과 연결되고, 최종적으로 각 hacker_id 마다 가장 높은 score를 합산한 total_score를 구하게 됩니다.
그리고 total_score가 0이 아닌 경우에만 결과에 포함하고, total_score를 기준으로 내림차순 정렬하며, 동일한 total_score인 경우 hacker_id를 기준으로 오름차순 정렬합니다.
따라서, 서브쿼리에서 challenge_id를 group by절에 포함하는 것은 가장 높은 score를 구하기 위한 그룹화의 역할을 한 것입니다.
그룹화를 통해 각 hacker_id와 challenge_id의 조합을 특정하고, 그 중에서 가장 높은 score를 찾을 수 있게 되는 것이죠.
이해에 도움이 되셨으면 좋겠습니다. 추가로 궁금한 점이 있으면 언제든지 물어보세요. 감사합니다!