You are given three tables: Students, Friends and Packages. Students contains two columns: ID and Name. Friends contains two columns: ID and Friend_ID (ID of the ONLY best friend). Packages contains two columns: ID and Salary (offered salary in $ thousands per month).
Write a query to output the names of those students whose best friends got offered a higher salary than them. Names must be ordered by the salary amount offered to the best friends. It is guaranteed that no two students got same salary offer.
Sample Input
Problem
best friends가 더 높은 급여를 받는 students의 name 추출하라.
단, best friends의 salary를 오름차순으로 정렬한다.
(같은 salary를 받는 two students는 존재하지 않음을 보장한다.)
Answer1
SELECT T.name
FROM(
SELECT S.id, S.name, P.salary
,F.friend_id
,(SELECT friend_P.salary FROM Packages friend_P WHERE F.friend_id = friend_P.id) as friend_Salary
FROM Students S, Friends F, Packages P
WHERE S.id = F.id AND S.id = P.id
) AS T
WHERE T.friend_Salary > T.salary
ORDER BY T.friend_Salary
핵심은 스칼라쿼리를 사용할 줄 아냐인것 같지만, 좀 더 쉬운 풀이도 존재할 것으로 생각한다.
우선은 hackerrank 한 바퀴를 돌고 다시 풀어보는 것으로....
How to solve
서브쿼리를 쓰면 그렇게 어렵지 않게 풀 수 있는 문제다.
서브쿼리를 안쓰고 뭔가 효율적인 쿼리를 만들어 낼 수준은 지금은 아니라서 우선 문제풀이에 집중해본다.
우선 Students 테이블에서 학생의 salary와 best_friend의 salary를 구해준다.
이 때, best_friend의 salary는 스칼라 서브쿼리를 써서 Friends 테이블의 friend_id와 Packages 테이블의 id를 결합해준다.
그럼 간단하게 student의 salary와 best_friend의 salary를 하나의 결과 테이블로 구현할 수 있다.
SELECT S.id, S.name, P.salary
,F.friend_id
,(SELECT friend_P.salary FROM Packages friend_P WHERE F.friend_id = friend_P.id) as friend_Salary
FROM Students S, Friends F, Packages P
WHERE S.id = F.id AND S.id = P.id
해당 쿼리를 인라인 뷰형태로 from절에 다시 묶어준다.
문제에서 요구한 name만 넣고, where절에는 best_friend의 salary가 student의 salary보다 높은 경우를 걸어준다.
(같은 salary는 존재하지 않으니, 등호는 할 필요없겠다.)
마지막으로 정렬조건인 friend의 salary를 오름차순으로 둔다.
SELECT T.name
FROM(
SELECT S.id, S.name, P.salary
,F.friend_id
,(SELECT friend_P.salary FROM Packages friend_P WHERE F.friend_id = friend_P.id) as friend_Salary
FROM Students S, Friends F, Packages P
WHERE S.id = F.id AND S.id = P.id
) AS T
WHERE T.friend_Salary > T.salary #best_friend의 salary가 student의 salary보다 높은 경우
ORDER BY T.friend_Salary
[ 23-02-05 : 서브쿼리에 대한 고찰 ]
실제로 업무를 하면서 느끼기도 한 점인데, 이런 류의 문제가 나올 때마다 마냥 쉽게 서브쿼리를 붙여가면서 풀어내는 방식이 옳지 않다는 걸 느낀다.
왜냐하면 내가 만든 대시보드에 짠 쿼리들을 보면서 나도 유지보수가 힘들어지는 순간은 언제나 복잡한 서브쿼리 때문이라는 걸 보게 되거든. 그래서 뭔가 본격적으로 튜닝에 대해서 공부도 해보고 싶은데 엄두가 안난다. 아무튼 지금은 여러 레퍼런스들을 보면서 일단 내 것으로 만들어보는 걸로...
'데이터 > SQL 문제풀이' 카테고리의 다른 글
HackerRank SQL - Interviews (2) | 2023.02.13 |
---|---|
HackerRank SQL - Symmetric Pairs (0) | 2023.02.12 |
HackerRank SQL - SQL Project Planning (2) | 2023.02.02 |
HackerRank SQL - Contest Leaderboard (0) | 2023.01.31 |
HackerRank SQL - Ollivander's Inventory (1) | 2023.01.29 |
댓글