본문 바로가기

코딩일기

SQL 코드카타 177 - Placements

https://www.hackerrank.com/challenges/placements/problem?isFullScreen=true

 

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

 

Column Type
ID Integer
Name String

 

Students 테이블:

  • ID : 학생의 id
  • Name  : 학생의 이름

 

Column Type
ID Integer
Friend_ID Integer

 

Friends 테이블:

  • ID : 학생의 id
  • Friend_ID : 그 학생과 가장 친한 친구의 id

 

Column Type
ID Integer
Salary Float

 

Packages 테이블:

  • ID : 학생의 id
  • Salary : 제안받은 급여

 

자신의 가장 친한 친구가 자신보다 더 높은 급여를 제안받은 학생들의 이름을 출력하는 쿼리를 작성하세요. 이름은 가장 친한 친구에게 제안된 급여 금액을 기준으로 정렬되어야 합니다. 두 학생이 동일한 급여 제안을 받은 경우는 없다고 보장됩니다.

 

select
    f.ID,
    my.Salary,
    f.Friend_ID,
    fri.Salary
from Friends f
left join Packages my on f.ID = my.ID
left join Packages fri on f.Friend_ID = fri.ID

 

학생과 친구가 제안받은 급여를 알아내기 위해 Friends 테이블에 Packages 테이블을 각각 학생의 id, 친구의 id를 기준으로 두번 결합한다.

 

select
    f.ID,
    my.Salary,
    f.Friend_ID,
    fri.Salary
from Friends f
left join Packages my on f.ID = my.ID
left join Packages fri on f.Friend_ID = fri.ID
where fri.Salary > my.Salary

 

where절을 사용해서 친구가 더 많은 급여를 제안받은 학생들만 출력한다.

 

select *
from
Students s
inner join
(select
    f.ID,
    my.Salary my_salary,
    f.Friend_ID,
    fri.Salary friend_salary
from Friends f
left join Packages my on f.ID = my.ID
left join Packages fri on f.Friend_ID = fri.ID
where fri.Salary > my.Salary) sal on s.ID = sal.ID

 

위의 쿼리를 Students테이블과 결합해서 친구보다 더 적은 급여를 제안받은 학생들의 이름을 구한다.

 

select
    s.Name
from
Students s
inner join
(select
    f.ID,
    my.Salary my_salary,
    f.Friend_ID,
    fri.Salary friend_salary
from Friends f
left join Packages my on f.ID = my.ID
left join Packages fri on f.Friend_ID = fri.ID
where fri.Salary > my.Salary) sal on s.ID = sal.ID
order by sal.friend_salary

 

학생의 이름을 출력하도록 하고 친구가 제안받은 급여를 기준으로 정렬하면 완료!