본문 바로가기

[LeetCode SQL50] - Subqueries 문제풀이

by qwee0328 2025. 2. 19.

LeetCode에서 SQL50 문제들을 풀어보았습니다.

이번 글에서는 SQL50 문제 중 Subqueries 7개를 풀어보겠습니다.
각 문제의 설명과 함께 SQL 풀이 코드를 제공하니, 차근차근 따라와 보세요! 🚀

아래는 해당 문제를 풀어볼 수 있는 링크입니다!

 

https://leetcode.com/studyplan/top-sql-50

 

 


 

📝 1978. Employees Whose Manager Left the Company

🔹 관리자가 회사를 떠난 직원

급여가 $30000 미만이고 관리자가 회사를 떠난 직원의 ID를 찾으십시오. 관리자가 회사를 떠나면 직원 테이블에서 해당 정보가 삭제되지만 보고서에는 여전히 관리자 ID가 떠난 관리자로 설정되어 있습니다.
Employee_id별로 정렬된 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • 급여가 $30,000 미만인 직원 중 관리자가 떠난 경우의 직원 ID 조회
  • 관리자가 떠난 경우 직원 테이블에서 삭제됨
  • Employee_id 기준으로 정렬

 

✅ SQL 풀이

   SELECT a.employee_id
     FROM Employees a
LEFT JOIN Employees b
       ON a.manager_id = b.employee_id
    WHERE a.manager_id IS NOT NULL
      AND b.employee_id IS NULL
      AND a.salary < 30000
    ORDER BY 1

 

 


 

📝 626. Exchange Seats

🔹 좌석 교환

연속된 두 학생마다 좌석 ID를 바꾸는 솔루션을 작성하세요. 학생 수가 홀수인 경우 마지막 학생의 ID는 교환되지 않습니다.
id를 기준으로 오름차순으로 정렬된 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • 연속된 두 학생의 좌석을 교환
  • 학생 수가 홀수인 경우 마지막 학생은 그대로 유지
  • id 기준 오름차순 정렬

 

✅ SQL 풀이

WITH last_seat AS (
    SELECT MAX(id) AS last
    FROM Seat
)
  SELECT id
       , CASE WHEN last % 2 = 1 AND id = last THEN student
              WHEN id % 2 = 1 THEN LEAD(student) OVER(ORDER BY id)
              WHEN id % 2 = 0 THEN LAG(student) OVER(ORDER BY id)
         END AS student
    FROM Seat
       , last_seat
ORDER BY id

 

 

반응형

 

📝 1341. Movie Rating

🔹 영화 평가

다음에 대한 솔루션을 작성하세요.
  • 가장 많은 영화를 평가한 사용자의 이름을 찾으십시오. 동점인 경우 사전순으로 더 작은 사용자 이름을 반환합니다.
  • 2020년 2월 평균 평점이 가장 높은 영화 이름을 찾습니다. 동점인 경우 사전순으로 더 작은 영화 이름을 반환합니다.

 

🔍 문제 설명

  • 가장 많은 영화를 평가한 사용자의 이름 조회 (동점 시 사전순)
  • 2020년 2월 평균 평점이 가장 높은 영화 이름 조회 (동점 시 사전순)

 

✅ SQL 풀이

(
   SELECT b.name AS results
     FROM MovieRating a
LEFT JOIN Users b ON a.user_id = b.user_id
 GROUP BY a.user_id
 ORDER BY COUNT(0) DESC, b.name
    LIMIT 1
)
UNION ALL
(
   SELECT b.title AS results
     FROM MovieRating a
LEFT JOIN Movies b ON a.movie_id = b.movie_id
    WHERE YEAR(a.created_at) = '2020' 
      AND MONTH(a.created_at) = '02'
 GROUP BY a.movie_id
 ORDER BY AVG(a.rating) DESC, b.title
    LIMIT 1
)

 

 


 

📝 1321. Restaurant Growth

🔹 레스토랑 성장

당신은 식당 주인이고 가능한 확장을 분석하려고 합니다(매일 적어도 한 명의 고객이 있을 것입니다).
7일 기간(즉, 오늘 + 6일 전) 동안 고객이 지불한 금액의 이동 평균을 계산합니다. average_amount는 소수점 이하 두 자리로 반올림되어야 합니다.
Visited_on을 기준으로 오름차순으로 정렬된 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • 7일 이동 평균 계산
  • 소수점 이하 두 자리 반올림
  • Visited_on 기준 오름차순 정렬

 

✅ SQL 풀이

  SELECT visited_on
       , amount
       , ROUND(amount / 7, 2) AS average_amount
    FROM (
          SELECT visited_on
               , SUM(amount) OVER(ORDER BY visited_on RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW) AS amount
               , MIN(visited_on) OVER() AS first_date
            FROM Customer
          ) sub
    WHERE visited_on >= first_date + 6
GROUP BY visited_on

 

 

728x90

 

📝 602. Friend Requests 2: Who Has the Most Friends

🔹 친구 요청 2: 친구가 가장 많은 사람

가장 많은 친구와 가장 많은 친구 수를 가진 사람을 찾는 솔루션을 작성하세요.
테스트 케이스는 한 사람만이 가장 많은 친구를 갖도록 생성됩니다.

 

 

🔍 문제 설명

  • 친구 수가 가장 많은 사람의 ID 및 친구 수 조회
  • 테스트 케이스는 한 명만 최대 친구 수를 가지도록 구성됨

 

✅ SQL 풀이

WITH request_and_accept AS (
       SELECT requester_id AS id
            , COUNT(0) AS num
         FROM RequestAccepted
     GROUP BY requester_id
    UNION ALL
       SELECT accepter_id AS id
            , COUNT(0) AS num
         FROM RequestAccepted
     GROUP BY accepter_id
)
  SELECT id
       , SUM(num) AS num
    FROM request_and_accept
GROUP BY id
ORDER BY num DESC
   LIMIT 1

 

 


 

📝 585. Investments in 2016

🔹 2016년 투자

다음과 같은 모든 보험 계약자에 대해 2016년 tiv_2016의 모든 총 투자 가치 합계를 보고하는 솔루션을 작성하세요.
  • 한 명 이상의 다른 보험 계약자와 동일한 tiv_2015 값을 갖고,
  • 다른 보험 계약자와 동일한 도시에 위치하지 않습니다.
  • (즉, (lat, lon) 속성 쌍은 고유해야 합니다).
tiv_2016을 소수점 이하 두 자리로 반올림합니다.

 

 

🔍 문제 설명

  • 동일한 tiv_2015 값을 가진 보험 계약자 조회
  • (lat, lon)이 다른 보험 계약자와 중복되지 않아야 함
  • tiv_2016을 소수점 이하 두 자리 반올림

 

✅ SQL 풀이

WITH tiv_2015 AS (
      SELECT tiv_2015
        FROM Insurance
	GROUP BY tiv_2015
      HAVING COUNT(0) > 1
)
SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016
  FROM Insurance a
  JOIN tiv_2015 b 
    ON a.tiv_2015 = b.tiv_2015
 WHERE (a.lat, a.lon) NOT IN (
                                SELECT lat
                                     , lon
                                  FROM Insurance
                              GROUP BY lat
                                     , lon
                                HAVING COUNT(0) > 1
                             )

 

 


 

📝 185. Department Top Three Salaries

🔹 부서 상위 3개 연봉

회사의 경영진은 회사의 각 부서에서 누가 가장 많은 돈을 벌고 있는지 확인하는 데 관심이 있습니다. 한 부서의 고소득자는 해당 부서의 상위 3개 고유 급여에 포함되는 급여를 받는 직원입니다.
각 부서에서 고소득 직원을 찾는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

🔍 문제 설명

  • 각 부서에서 상위 3명의 고소득 직원 조회
  • 동일 급여자가 있을 경우 dense_rank() 사용

 

✅ SQL 풀이

WITH salary_rank AS (
       SELECT b.name AS department
            , a.name
            , a.salary
            , DENSE_RANK() OVER(PARTITION BY b.id ORDER BY a.salary DESC) AS rnk
         FROM Employee a
	LEFT JOIN Department b 
           ON a.departmentId = b.id
)
SELECT department AS Department
     , name AS Employee
     , salary AS Salary
  FROM salary_rank
 WHERE rnk < 4

 

 

 

728x90
반응형