채널톡 아이콘

인프런 커뮤니티 질문&답변

seoy68243님의 프로필 이미지

작성한 질문수 1

[백문이불여일타] 데이터 분석을 위한 고급 SQL

서브쿼리 해커랭크 문제풀이

Top Earners 문제관련 질문

해결된 질문

작성

·

33

0

안녕하세요, Top Earners 문제 관련 질문 있습니다.

저는 From절 서브쿼리를 사용해 보았는데

제 풀이에 어떤 오류가 있는지 알고 싶습니다.

제가 작성한 쿼리는 다음과 같습니다.

SELECT MAX(tmp.earnings), COUNT(tmp.name)
FROM (SELECT employee_id,name,months,salary,months*salary as earnings
      FROM Employee
      ) as tmp
GROUP BY earnings
ORDER BY earnings DESC
LIMIT 1

답변 2

0

지식공유자 J님의 프로필 이미지
지식공유자 J
지식공유자

실행해 보니 오류 없이 잘 실행됩니다.
ORDER BY와 LIMIT을 사용해 풀어주셨는데, 이렇게 풀어도 문제는 없습니다.
강의에서 알려드린 풀이법이 더 일반적이니 같이 알아두시면 좋을 것 같아요.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. seoy68243님.

SQL 쿼리를 작성하시면서 발생한 문제에 대한 고민이 있으신 것 같습니다. 작성하신 쿼리를 함께 살펴보겠습니다.

  1. MAX(tmp.earnings): 현재 GROUP BY earnings로 인해 각 earnings 값마다 그룹이 형성되어 있습니다. 따라서, MAX(tmp.earnings)는 각 그룹 내에서 최대값을 반환하게 됩니다. 하지만, 쿼리의 의도는 각 그룹이 아닌 전체 데이터에서 최대 earnings 값을 가져오고자 하는 것일 수 있습니다.

  2. COUNT(tmp.name): COUNT(tmp.name)은 특정 earnings 값을 가진 레코드의 개수를 카운트합니다. 그러나 각 earnings에 대해 하나의 레코드만 존재할 가능성이 높기 때문에, 대부분 결과가 1이 될 것입니다.

  3. LIMIT 1: ORDER BY earnings DESCLIMIT 1이 작동하여 가장 높은 earnings 값을 가진 하나의 레코드만 선택되겠지만 쿼리의 목적과 맞는지는 다시 확인해볼 필요가 있습니다.

LIMIT 1GROUP BY의 조합은 주의 깊게 사용해야 합니다. 따라서 쿼리를 재검토하여 전체에서 가장 높은 earnings를 가진 직원의 데이터를 정확히 찾으려면 수정이 필요합니다. 아래와 같이 쿼리를 수정할 수 있습니다:

SELECT employee_id, name, MAX(earnings) as max_earnings
FROM (SELECT employee_id, name, months*salary as earnings
      FROM Employee) as tmp
GROUP BY employee_id, name
ORDER BY max_earnings DESC
LIMIT 1;

위 쿼리는 각 직원에 대해 가장 높은 earnings 값을 그룹화하여 정렬하고, 그 중 가장 높은 값을 가진 직원의 정보를 가져옵니다.

위 설명이 도움이 되길 바랍니다. 해당 문제에 대한 비슷한 질문과 답변이 도움될 수 있는 글을 아래에 추천드리니 참고하시면 좋을 것 같습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.