-
카테고리
-
세부 분야
데이터 분석
-
해결 여부
미해결
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 전에 진행하는데요.
그룹핑을 하고 조건을 주면 안되는 이유가 잘 이해되지 않습니다. 설명 부탁 드릴 수 있을지요?
답변을 작성해보세요.
4
이보민
지식공유자2021.10.13
안녕하세요 붉은은짱님
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을 사용하시면 됩니다.
도움이 되셨길 바랍니다.
감사합니다.
답변 1