SQL/SQL 문제

[SQL] HackerRank - Placements(M)

dori_0 2022. 6. 1. 16:16

   Placements  

 

Placements | HackerRank

Write a query to output the names of those students whose best friends got offered a higher salary than them.

www.hackerrank.com

 


# Problem

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.

 

 

Explanation

See the following table:

Now,

* Samantha's best friend got offered a higher salary than her at 11.55

* Julia's best friend got offered a higher salary than her at 12.12

* Scarlet's best friend got offered a higher salary than her at 15.2

* Ashley's best friend did NOT get offered a higher salary than her

 

The name output, when ordered by the salary offered to their friends, will be:

* Samantha

* Julia

* Scarlet

 

 


# Answer

1) 자신보다 친구의 salary가 더 많은 학생들의 이름 출력하기
2) 친구의 salary 기준으로 정렬하기

 

먼저, 세 테이블을 JOIN 해주어야 한다.

 

1. Students와 Packages 테이블을 ID 기준으로 JOIN해 각 학생의 이름과 Salary를 볼 수 있도록 하였다.

2. Students와 Friends 테이블을 ID 기준으로 JOIN해 기존 테이블에 각 학생의 친구 컬럼을 추가해주었다.

3. 마지막으로 친구들의 Salary 컬럼을 추가하기 위하여 Friends 테이블의 Friend_id와 Packages 테이블의 ID를 기준으로 JOIN해주었다.

SELECT *
  FROM students AS s
 INNER JOIN packages AS p 
         ON s.id = p.id
 INNER JOIN friends AS f 
         ON s.id = f.id
 INNER JOIN packages AS p2 
         ON f.friend_id = p2.id;

 

학생의 Salary보다 친구의 Salary가 높은 학생을 추출하기 위해 WHERE절에 조건을 추가했다.

친구의 Salary (p2.salary)를 기준으로 정렬하기 위해 ORDER BY에 추가해주었다.

SELECT s.name
  FROM students AS s
 INNER JOIN packages AS p 
         ON s.id = p.id
 INNER JOIN friends AS f 
         ON s.id = f.id
 INNER JOIN packages AS p2 
         ON f.friend_id = p2.id
 WHERE p.salary < p2.salary
 ORDER BY p2.salary;

최종 출력은 학생의 이름이므로 SELECT에 s.name을 적어주었다.