데이터를 쉽게 찾고 잘 활용할 수 있는 기반을 만드는, Data Analytics Engineer
[주제]
[아티클 요약]

[인사이트]
처음에는 아티클 스터디를 하면서 용어도 어렵고 잘 와닿지 않았는데, SQL을 공부해보고 많은 아티클을 접하면서 점점 그 내용의 중요성이 더 느껴지는 것 같다. 아직 데이터 분석에 대해 아는 것은 적지만, 어제 봤던 리디의 데이터 분석가보다 토스의 데이터마트팀 DAE의 업무가 더 관심이 가고 내 성향에 더 맞을 것 같다는 생각이 들었다. 특히 오늘 아티클을 통해 서버 개발자, DBA, 데이터 분석 플랫폼팀, DW팀, 데이터 매니저, 테크니컬 프로덕트 매니저(TPM) 등 정말 다양한 데이터 관련 직무가 있다는 것을 알 수 있었다. 다양한 직무가 있는 만큼 세부적인 업무에 대해 미리 파악하고 범위를 좁혀서 준비할 수 있었으면 좋겠다. 마지막으로, 아티클의 내용은 아는 만큼 보인다고 느껴져서 본캠프를 수료하고 나서 정리해놓은 아티클 스터디를 다시 한 번 보고 지금과는 또 다른 인사이트를 얻어갈 수 있으면 좋겠다.
SELECT
e1.Name
, e1.Department
, e1.Salary
, e2.Name Top_Earner
, e2.Salary Top_Salary
FROM employees e1
JOIN employees e2
# 두 테이블을 Department로 JOIN하여 연동
ON e1.Department = e2.Department -- 이로 인해 결과에 중복을 발생시켜줌
WHERE
e2.Salary =
(
SELECT
MAX(e3.Salary)
FROM employees e3
# 주 쿼리에서 선택된 e1.Department 값에 대해서만 최고 월급을 계산
WHERE e1.Department = e3.Department
);
어제랑 비슷하게 서브쿼리가 이해가 안되서, 계속 GPT를 잡고 있었다.
드디어 이해한 내용은 다음과 같다
계산을 행 별로 하기 때문에 e1.Department는 전체 Department 리스트가 아니라, 선택된 한 명의 직원의 Department를 의미한다
- 주쿼리는 e1테이블에서 각 직원 한 명씩 처리한다.
- 각 직원(e1)에 대해 그 직원이 속한 부서(e1.Department)를 확인하고, 해당 부서에서 최고 월급을 받는 직원을 찾기 위해 서브쿼리가 실행된다.
- 서브쿼리는 주 쿼리에서 처리 중인 각 직원의 부서(e1.Department)에 대해 실행된다.
- 서브쿼리는 해당 직원이 속한 부서에 대해 최고 월급을 받는 직원을 찾는다.
- 다음 직원으로 반복!
주 쿼리에서 첫 번째 직원(Alice)을 처리.
-> Alice가 속한 HR 부서에 대해 서브쿼리가 실행되어 Eve가 최고 월급을 받는 직원으로 확인.
주 쿼리에서 두 번째 직원(Bob)을 처리.
-> Bob이 속한 IT 부서에 대해 서브쿼리가 실행되어 Heidi가 최고 월급을 받는 직원으로 확인.
주 쿼리에서 세 번째 직원(Charlie)을 처리.
-> Charlie가 속한 IT 부서에 대해 서브쿼리가 실행되어 Heidi가 최고 월급을 받는 직원으로 확인.
SELECT
e.Department
, AVG(e.Salary) AVG_Salary
FROM employees e
GROUP BY e.Department
HAVING AVG(e.Salary) =
(
SELECT MAX(AVG_Salary)
FROM
(
SELECT AVG(e.Salary) AVG_Salary
FROM employees e
GROUP BY e.Department
)subq
);
이건 그나마 빨리 했다. 슬렉 질문방 읽어보니 확실히 비효율적인 쿼리가 맞다.
SELECT
e.Department
, AVG(e.Salary) AVG_Salary
FROM employees e
GROUP BY e.department
ORDER BY AVG_Salary DESC LIMIT 1;
이게 훨씬 깔끔. 공동 1위라서 제대로 표현하지는 못한다. 아무튼 넘어가자.
SELECT
c.CustomerName
, SUM(p.Price * o.Quantity) Total_Amount
, COUNT(*) order_count
FROM orders o
JOIN customers c
ON o.CustomerID = c.CustomerID
JOIN products p
ON o.ProductID = p.ProductID
GROUP BY c.CustomerName;
답은 맞았는데, 결과가 다르다. 혹시 몰라서 답 복사해서 넣어도 똑같다. 내 데이터가 잘못 입력되었을까봐 봤는데도 똑같다. 답지의 문제인가..? 질문하려고 헀는데 이미 다른 분이 먼저 하셔서 기다려야겠다.

SELECT
p.Category
, p.ProductName Top_Product
# 제품 별 총 판매량 계산
, SUM(o.Quantity) TotalSold
FROM orders o
JOIN products p
ON o.ProductID = p.ProductID
GROUP BY p.Category, p.ProductName
# 제품별 총 판매량이 카테고리별 최대인 것으로 조건 제시
HAVING SUM(o.Quantity) =
(# 서브쿼리 작성
SELECT
# 카테고리별 총 판매량의 최대값
MAX(sum_Quantity)
FROM # 위와 동일하게 카테고리별 총 판매량 계산 sum_Quantity
(SELECT
p2.Category,
SUM(o2.Quantity) AS sum_Quantity
FROM
Products p2
JOIN Orders o2
ON p2.ProductID = o2.ProductID
GROUP BY
p2.Category, p2.ProductID
) Subq
);

lv5의 2번문제와 동일한 방식으로 풀기. 근데 같은 쿼리를 본쿼리와 서브쿼리에 똑같이 쓰는건 비효율적인거 같은데 효율적으로 푸는 방법이 없을까 궁금하다.
아티클 스터디 종료! 앞으로 사전캠프 삼일 남았다. 북스터디 잘 하고 7번 문제까지 다 풀 수 있었으면 좋겠다! 달리기반 솔직히 완벽히 이해는 안가지만 그래도 한 번 훑고 본캠프 들어가면 반드시 큰 자산이 될 것이다.