• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

SET_문제 4번_TOP Competitors 관련 문의 드립니다.

21.10.09 15:28 작성 조회수 137

1

안녕하세요. 좋은 강의에 감사 드립니다.

저 같은 경우, 4번 문제를 다음과 같이 해결을 하고자 하였으나 정상적으로 진행되지 않았습니다.

SELECT H.hacker_id, H.name

FROM Submissions AS S

     INNER JOIN Challenges AS C ON S.challenge_id = C.challenge_id

     INNER JOIN Difficulty AS D ON C.difficulty_level = D.difficulty_level

     INNER JOIN Hackers AS H ON H.hacker_id = S.hacker_id

GROUP BY H.hacker_id, H.name

HAVING S.score = D.score AND COUNT(S.submission_id) > 1

ORDER BY COUNT(S.submission_id) DESC, H.hacker_id ASC

 

문제 풀이를 보면 "S.score = D.score" 를 GROUP BY 전에 진행하는데요.

그룹핑을 하고 조건을 주면 안되는 이유가 잘 이해되지 않습니다. 설명 부탁 드릴 수 있을지요?

답변 1

답변을 작성해보세요.

4

안녕하세요 붉은은짱님

HAVING의 경우 GROUP BY를 진행한 후 실행되는 구문이기 때문에 GROUP BY로 그룹핑이 된 결과값에 대해서만 조건을 걸어줄 수 있습니다.

위 예시에서는 이미 GROUP BY에서 H.hacker_id와 H.name으로 그룹이 구성된 상태이기 때문에 S.score, D.score라는 개별 데이터에 대해서는 확인이 불가능 한데요.

이해가 어려우실 수도 있을 것 같아 조금 추상적인 예시를 들어 설명드려보겠습니다.

예를 들어, 올림픽에 개인전으로 출전한 선수들끼리는 개인 기록을 비교하여 확인할 수 있지만, 단체적에 출전한 선수들끼리는 개인 기록을 비교하지 않고 팀 기록을 서로 비교하여 우위를 정하는 것과 비슷하다고 생각해주시면 될 것 같습니다.

단체전에서는 팀으로 이미 선수들이 묶여있기 때문에, '팀 이름을 가나다 순으로 비교'하거나, '팀원들의 기록 평균이 A팀과 B팀에서 어떻게 차이가 나는지'는 확인 할 수 있지만, A팀의 1번 선수의 기록과 B팀의 5번 선수의 기록을 1:1로 비교하지는 않는 것(또는 규정상 그렇게 할 수 없는 것)이죠.

정리하자면 개별 데이터들을 비교하고 싶으면 WHERE문에서 조건을 사용하고, 그룹별로 묶인 상태에서 무언가를 비교하고 싶으면 HAVING을 사용하시면 됩니다.

도움이 되셨길 바랍니다.

감사합니다.