• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

top earnings 복습하며 다시 짠 코드

22.05.20 22:55 작성 조회수 96

0

강의 코드

SELECT salary * months AS earnings
      ,COUNT(*)
FROM employee
GROUP BY earnings
ORDER BY earnings DESC
LIMIT 1

----
내가 푼 코드
SELECT MAX(months*salary) AS max_total_earnings
      ,COUNT(*)
FROM employee
GROUP BY months*salary
HAVING count(*)=7

 

안녕하세요

해커랭크 문제 복습하며 제 생각대로 코드를 짜봤습니다.

다행히 해커랭크에선 통과했지만

두 코드 간 디테일한 차이가 있지 않을까 해서 질문 남깁니다.

 

같은 결과값이지만,

어떨 때 ORDER BY 와 LIMIT으로 구하는게 적절하고

어떨 때 HAVING을 활용하는게 좋은지

경험을 나눠주시면 도움될 것 같습니다 감사합니다.

 

 

답변 1

답변을 작성해보세요.

0

안녕하세요.

이 문제에서 조회해야 하는 데이터는 가장 높은 액수의 earning과, 그만큼을 받는 직원 수인데요.
이 두 가지를 문제의 input 데이터가 아니라 다른 데이터로부터 추출할 경우가 생긴다면, 직접 작성해 주신 쿼리를 적용하기는 힘들 것 같아요.

HAVING COUNT(*) = 7 조건을 주신 것은,
이미 데이터를 이리저리 살펴보신 후에 가장 높은 액수를 받는 직원 수가 7명인 사실을 알고 계신 상태였기에 작성할 수 있으셨던 것 같아요.
그런데 다른 데이터에서는 가장 높은 액수를 받는 직원 수가 꼭 7명일 거라고는 보장할 수가 없습니다.

해당 데이터에 맞는 숫자로 바꿔서 작성하는 방법도 있겠지만, 그건 비효율적인 방법입니다. 
왜냐하면 그 맞는 숫자라는 것은 사실 우리가 구해야 하는 두 가지 중 하나로, 이를 찾는 과정에서 벌써 정답의 반절을 구한 게 되거든요. 
반절을 먼저 찾고 나서 이를 이용해 다시 쿼리를 짜서 남은 반절을 찾는 것보다는, 
한 번에 두 가지를 같이 추출할 수 있고, 어떤 데이터에도 적용 가능한 쿼리가 더 효율적이지 않을까요?

어떤 경우에 ORDER BY, LIMIT을 쓰고 어떤 경우에 HAVING을 쓴다고 정해져 있는 것은 아니고, 
보통 그 때 그 때 효율성과 가독성이 좋은 방식으로 쿼리를 작성한다는 점을 염두에 두시면 좋을 것 같아요!