코딩테스트/SQL 코드카타

MySQL 해커랭크 | Placements (자신과 친한 친구의 급여 비교하기)

ANNASENA 2024. 8. 28. 08:00
728x90

 

문제

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

  • 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.

# 문제 해석

  • 친한 친구가 자신보다 높은 급여를 받는 경우에 해당하는 학생들의 이름 조회하기
  • 이름은 자신의 친한 친구가 받는 급여 크기로 정렬하기

 

테이블

Students 테이블 Friends 테이블 Packages 테이블

 

풀이과정

# 가상테이블 fs 생성

  • 세 테이블을 ID를 기준으로 INNER JOIN함
    • FROM절에 조인할 테이블을 모두 넣고, WHERE절에 조건을 넣어주면 INNER JOIN됨
  • ID와 이름, 급여, 친한 친구ID까지 SELECT문에 조회해줌
    • 나중에 친한 친구ID에 해당하는 친구의 급여를 Packages 테이블에서 한 번 더 조인해줄 것이기 때문
1
2
3
4
5
6
WITH fs AS(
           SELECT s.ID, s.Name, p.Salary, f.Friend_ID  
           FROM Students s, Friends f, Packages p 
           WHERE s.ID = f.ID AND f.ID = p.ID 
           )
SELECT * FROM fs
cs

 

# 내 ID, 내 이름, 내 급여 | 친구 ID, 친구 급여 

  • 내 급여와 친구 급여를 한 눈에 볼 수 있게 한 번 다같이 조회해봄
1
2
3
4
5
6
7
WITH fs AS(
           SELECT s.ID, s.Name, p.Salary, f.Friend_ID  
           FROM Students s, Friends f, Packages p 
           WHERE s.ID = f.ID AND f.ID = p.ID 
           )
SELECT fs.*, p.Salary FROM fs
JOIN Packages p ON fs.Friend_ID = p.ID
cs

 

# 정답

  • 가상 테이블과 Packages 테이블을 조인해 친한 친구의 급여도 알 수 있게 만듦 
  • WHERE절에서 자신의 급여보다 친한 친한 친구의 급여가 높은 경우를 조건으로 주어 레코드 필터링
  • 급여 기준으로 정렬
1
2
3
4
5
6
7
8
9
WITH fs AS(
            SELECT s.ID, s.Name, p.Salary, f.Friend_ID  
            FROM Students s, Friends f, Packages p 
            WHERE s.ID = f.ID AND f.ID = p.ID 
           )
SELECT fs.Name FROM fs
JOIN Packages p ON fs.Friend_ID = p.ID 
WHERE fs.Salary < p.Salary
ORDER BY p.Salary
cs

728x90