top earnings 복습하며 다시 짠 코드
184
작성한 질문수 2
강의 코드
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을 쓴다고 정해져 있는 것은 아니고,
보통 그 때 그 때 효율성과 가독성이 좋은 방식으로 쿼리를 작성한다는 점을 염두에 두시면 좋을 것 같아요!
리트코드 1280. Students and Examinations
0
94
3
16강 LEFT JOIN 리트코드 (183. Customers Who Never Order) 관련 질문
0
103
2
African Cities 문제관련 질문
0
65
1
SQL 코딩테스트 질문
0
243
1
HACKER RANK에서 문제찾기
0
109
2
강의 자료 다운로드
0
101
2
Asian population 문제가 없어요
0
88
2
INNER JOIN 에서 A.키 쓸때 빨간 색 나오고 'dause'
0
77
2
별칭 관련해서 질문 있습니다.
0
88
2
rising temperature 문제 질문
0
110
2
해커랭크 TOP EARNERS 문제 질문
0
110
1
ON 뒤에 질문
0
106
2
INNER JOIN 질문. 강의와 결과값이 다릅니다.
0
211
3
END, 뒤에 * 붙이면 에러가 뜹니다
1
213
2
CustomerID가 중복되서 나타나요
0
242
3
별칭이 전체 테이블을 못 불러와요.
0
152
2
CASE WHEN 쿼리 오류 문의
1
342
3
CASE문제풀이 질문
0
133
1
Customers Who Never Order 풀다가 Alias관련 질문사항
0
141
1
Average Population 질문
0
143
1
Revising Aggregations - The Count Function 질문
0
111
1
Average Population of Each Continent 에대해서 질문
0
200
3
w3schools 에서 쿼리 작성 질문
0
168
1
INNER JOIN 할 때 NULL 값이 안보일 수도 있나요?
0
332
1





